char k={“abcdefghijklmn”}; 这是定义了一个字符串,并且字符指针k指向a,可以试验k %c打印即为 字符‘a’.
char p=&k;
printf(“sizeof§:%lu\n”,sizeof§);
printf("sizeof(p):%lu\n",sizeof(p));
printf(“sizeof(k):%lu\n”,sizeof(k));
printf("%s\n",k);
printf("%p\n",k);
char *i=&p;
printf("%lu\n",sizeof(i));
printf(“k+1:%p\n”,k+1);
printf("&k+1:%p\n",&k+1);
printf("&k:%p\n",&k);
printf(“p:%p\n”,p);
printf(“p+1:%p\n”,p+1);
printf("&p:%p\n",&p);
printf(“i:%p\n”,i);
printf("i:%p\n",i);
printf(“i+1:%p\n”,i+1);
指针也是有大小的占内存,64位机为8个字节;k,i,p都为指针,大小都为8个字节。
注意:还可以看到字符指针k放在栈中 ,上图中打印的k实际为k所存的内容,并不是k的地址地址为
&k才是k的地址,字符串放在常量区
k为char型 加 1 加一个字节(去掉一个号就是要加的类型)
p为char型 加1 加8个字节(char为指针类型+1加8个字节)
i为char型 加1 加8个字节(char*为指针类型,+1为加8个字节)
注意:在函数当中,先存哪个后存哪个和编译器编译成汇编以后有关。在这个例子中,先存的放在了栈顶(低地址),后存的放在了栈底(高地址)。
int a;
printf(“a:%p\n”,&a);
a=2;
printf(“a:%p\n”,&a);
a 是个局部变量存放在栈中
2位整型常量 存放在数据段的.rodata中