#include<string.h>
void func(char str[50])
{
printf("A %d B %d ",sizeof(str), strlen(str));
}
int main(void)
{
char stra[] = "HelloWorld";
char *strb = stra;
printf("M=%d ",strb);
int b=sizeof(++strb);
printf("C %d D %d ",sizeof(stra), b);
printf("N=%d ",strb);
func(++strb);
printf("O=%d ",strb);
printf("E %d F %d\n",strlen(stra), strlen(strb++));
return 0;
}
运行的结果:
M=2293600 C 11 D 4 N=2293600 A 4 B 9 O=2293601 E 10 F 9
想知道 为何 sizeof(++strb) 指针地址没有变化呢
10 个解决方案
#1
sizeof() 只会做字节大小的计算,不会对表达式进行运算的,
例如;
int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。
例如;
int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。
#2
sizeof 是求类型大小,都是指针,大小恒定
#3
根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, int b=sizeof(++strb); 在编译的时候被翻译成 sizeof(++strb的数据类型), 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++strb了。
#4
sizeof操作符中的表达式不会被计算,它仅仅获取表达式的返回类型的大小
#5
sizeof 是静态编译期计算的,因此不会执行运行期动作
#6
如楼上
#7
指针变量的sizeof
指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)();// 函数指针
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf );// 结果为4
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。
指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)();// 函数指针
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf );// 结果为4
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。
#8
1.对于指针,sizeof(指针对象)操返回这个指针占的空间,一般是4个字节;
对于一个数组,sizeof(数组)返回这个数组所有元素占的总空间。
sizeof()函数会将最后字符串的结束符“\0”也作为一个字符计算在内!
2.strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。
对于一个数组,sizeof(数组)返回这个数组所有元素占的总空间。
sizeof()函数会将最后字符串的结束符“\0”也作为一个字符计算在内!
2.strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。
#9
指针就是4字节哈
#10
谢啦! 最近在做C语言的笔试题 还真多平时不注意的问题
#1
sizeof() 只会做字节大小的计算,不会对表达式进行运算的,
例如;
int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。
例如;
int a = 4;
sizeof( ++a ) = 4;
结果a = 4不变的。
#2
sizeof 是求类型大小,都是指针,大小恒定
#3
根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, int b=sizeof(++strb); 在编译的时候被翻译成 sizeof(++strb的数据类型), 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++strb了。
#4
sizeof操作符中的表达式不会被计算,它仅仅获取表达式的返回类型的大小
#5
sizeof 是静态编译期计算的,因此不会执行运行期动作
#6
如楼上
#7
指针变量的sizeof
指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)();// 函数指针
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf );// 结果为4
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。
指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)();// 函数指针
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf );// 结果为4
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。
#8
1.对于指针,sizeof(指针对象)操返回这个指针占的空间,一般是4个字节;
对于一个数组,sizeof(数组)返回这个数组所有元素占的总空间。
sizeof()函数会将最后字符串的结束符“\0”也作为一个字符计算在内!
2.strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。
对于一个数组,sizeof(数组)返回这个数组所有元素占的总空间。
sizeof()函数会将最后字符串的结束符“\0”也作为一个字符计算在内!
2.strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。
#9
指针就是4字节哈
#10
谢啦! 最近在做C语言的笔试题 还真多平时不注意的问题