VC指针 有些东西不清楚了

xspace_time 2012-08-09 11:46:02
定义指针char *fp1,*fp2,*fp3; //看起来是定义了char类型 指针fp1 指针fp2 指针fp3
但对于char* fp1,fp2,fp3; //看起来是定义了char类型指针 fp1 fp2 fp3,那么fp2 fp3是否为指针

对于char *fp1,*fp2,*fp3;//编译器是从右往左读的 对于char类型 是使用堆栈分配地址的
fp1-8=fp2-4=fp3地址分配从右往左是由小到大的
那么VC分配地址是否分配的过程图和呢
...全文
238 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xspace_time 2012-08-11
  • 打赏
  • 举报
回复
是用VC6.0或者VC 2008编译
void main()
{
char* fp1,fp2,fp3;
}
如何得到像汇编代码一样简洁的反汇编代码呢
ForestDB 2012-08-10
  • 打赏
  • 举报
回复
定义指针char *fp1,*fp2,*fp3; //看起来是定义了char类型 指针fp1 指针fp2 指针fp3
// 正确

但对于char* fp1,fp2,fp3; //看起来是定义了char类型指针 fp1 fp2 fp3,那么fp2 fp3是否为指针
// fp2和fp3不是指针

对于char *fp1,*fp2,*fp3;//编译器是从右往左读的 对于char类型 是使用堆栈分配地址的
fp1-8=fp2-4=fp3地址分配从右往左是由小到大的
// 不太清楚LZ想表达什么,但是一般来说,栈是“倒”着的,即大地址在上,是栈底,然后在这个上下文,fp1最先进栈,地址最大,fp3后压栈,地址小。这个用debugger或者打印地址方式都可以看出来。
fzamygsd 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
真 TM 服了 CSDN 了,第二个的帖子发了好多次没发出来。而提交了第三个帖子,提示成功后显示的却是第二个,这不知道啥时候第三个又莫名其妙的出来的………………………………
[/Quote]
yuqangy 2012-08-10
  • 打赏
  • 举报
回复
但对于char* fp1,fp2,fp3; //看起来是定义了char类型指针 fp1 fp2 fp3,那么fp2 fp3是否为指针
vc2008里fp2认为是char
windows好像都是从小到大分配内存地址的吧
「已注销」 2012-08-10
  • 打赏
  • 举报
回复
真 TM 服了 CSDN 了,第二个的帖子发了好多次没发出来。而提交了第三个帖子,提示成功后显示的却是第二个,这不知道啥时候第三个又莫名其妙的出来的………………………………
AnYidan 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
char* fp1,fp2,fp3 操作符*只是修饰fp1,fp2和fp3都是char类型的。
fp1是占4个字节,fp2和fp3占1个字节。压栈的顺序应该是fp1,fp2,fp3吧。
[/Quote]

++

入栈的顺序是 compiler 的权力,c 规则中没有规定
「已注销」 2012-08-10
  • 打赏
  • 举报
回复
补充一下:
按照 C 风格的强制类型转换写法:
pstr = (char *)malloc(MAX_PATH);
极易认为 char * 也是一种数据类型。
char * fp1, fp2, fp3;
从而让人这么认为:因为 char * 是数据类型,即声明了三个指针。
这种想法是错误的。

我们先这样来生命一个新名称 PCHAR:
typedef char *PCHAR;
此时 PCHAR 和 char 身份一样了,都是数据类型。
PCHAR fp1, fp2, fp3;
由于 PCHAR 是数据类型,fp1, fp2, fp3 类型就与 PCHAR 等同,即指向 char 的指针。

从 typedef 还是 char *fp1 都可以看出来:
char 与 *PCHAR 是等价的,而 char * 与 PCHAR 不等价。
char 和 PCHAR 都是数据类型,但 char * 只是一种写法,不代表任何数据类型。
「已注销」 2012-08-10
  • 打赏
  • 举报
回复
再补充一下,C 风格强制类型转换写法:
pstr = (char *)malloc(MAX_PATH);
会让人感觉 char * 是一个类型,故而采用:
char * fp1, fp2, fp3;
这样的写法,极易认为是声明了三个指针。

我个人从不认为 char * 算是一种数据类型。
但是如果我这样写来定义了一个新名称 PCHAR:
typedef char *PCHAR;
此时 PCHAR 与 char 身份一样了,同属于数据类型。
由于 PCHAR 是数据类型,所以这样的声明写法:
PCHAR fp1, fp2, fp3;
即声明了三个 PCHAR 类型的变量,即三个指向 char 的指针。

即:char 与 *PCHAR 是等价的,而非 char * 与 PCHAR 等价。
因为 char * 不是数据类型,而只是一种写法。
xxb249 2012-08-10
  • 打赏
  • 举报
回复
char* fp1,fp2,fp3 ===》char *fp1,fp2,fp3
优先级问题,*只修士fp1 fp2,fp3都是char 并非是指针
自信男孩 2012-08-10
  • 打赏
  • 举报
回复
char* fp1,fp2,fp3 操作符*只是修饰fp1,fp2和fp3都是char类型的。
fp1是占4个字节,fp2和fp3占1个字节。压栈的顺序应该是fp1,fp2,fp3吧。
冰与火 2012-08-10
  • 打赏
  • 举报
回复
char* fp1,fp2,fp3; fp1是指针,其他两个不是,如果你想批量定义指针,你要用typedef char* CHARPTR;
然后CHARPTR fp1, fp2,fp3;就都是指针了。
「已注销」 2012-08-10
  • 打赏
  • 举报
回复
星号应该紧邻变量名,而非类型名。
虽然不管星号紧邻变量还是紧邻类型,都是一样效果,但像上面那样写,会造成误解。
char *fp1, *fp2, *fp3;
声明了三个 char 类型变量:*fp1, *fp2, *fp3。
char *fp1, fp2, fp3;
声明了三个 char 类型变量:*fp1, fp2, fp3。

C 语言只介绍说,* 放在指针类型前面表示对地址“解引用”,也就是说 * 加指针表示指针指向的变量类型,并没说 * 星号放在类型名后面是什么意义。可以这样理解:*fp1 是 char 类型,fp1 当然就是一个指向 char 类型的指针类型。在 Windows SDK 中,有这样的声明方式,我就觉得很好理解:
typedef char *PCHAR;
PCHAR pch = (PCHAR)&a;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧