繁体   English   中英

玩指针,char *字符串使人迷茫和困惑

[英]Playing with pointers, dazed and confused by char * strings

因此,我在玩指针以了解不同的用例,对此我并不那么有经验,也无法将自己的想法付诸实践。 我会在出现问题的地方划上界线。 请帮助我理解指针。

在第6行:

我为什么不能将字符串称为数组,因为我认为这就是它存储在内存中的方式。 如何访问字符串的各个字符?

在7-8行:

int数据类型占用4个字节时,为什么&str&str + 1之间有8个字节的差异

在第9,10和12行:

为什么使用*str引用字符串将int作为输入? 为什么将单个字节的charint而不是转换4个字节?

char *str = "Ninechars";
printf("Start\n");
printf("%s\n", str);
printf("%p\n", str);    // address of first char of str
printf("%p\n", str+1);  // address of second char of str
// printf("%s\n", str[1]);  // [segfault] warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [TODO]
printf("%p\n", &str);   // address to head of the string? NO, address of the pointer var str
printf("%p\n", &str+1); // [TODO], difference of 8bytes b/w this and previous address value? [WHY]?
printf("%d\n", *str);   // what integer is this? -> whatever can be made from 'N'=78
printf("%d\n", *(str+1));   // 'i'=105, but why is it taking single byte ints [TODO]
printf("%ld\n", sizeof(1)); // 4 bytes, as expected
// printf("%s\n", *str);    // [?]Wrong, [HOW][WHY], format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’[TODO]
printf("End\n");
Output:
Start
Ninechars
0x40088f
0x400890
0x7fff95a594e8
0x7fff95a594f0
78
105
4
End

完整的代码文件在这里: http : //ideone.com/ryag80

让我们逐行检查它:


char *str = "Ninechars";
printf("Start\n");
printf("%s\n", str);
printf("%p\n", str);    // address of first char of str
printf("%p\n", str+1);  // address of second char of str

以上地址是进程虚拟内存的数据段的一部分。


printf("%s\n", str[1]);

实际上, str[1] == *(str + 1) %s期望的是char * ,即(str + 1)&str[1]


printf("%p\n", &str);   
printf("%p\n", &str+1);

&str是的地址str ,一个指针到char 它在堆栈上。

8个字节的差异意味着, 在您的系统上 ,指向char的指针的大小为8个字节。 尝试printf("\\nsizeof(char*) == %zd\\n", sizeof(char*))进行验证。


printf("%d\n", *str);

它是NASCII码


printf("%d\n", *(str+1));

确实是'i' == 105 (再次是ASCII码 ),并且您指示printf()使用%d将其打印为int


printf("%ld\n", sizeof(1)); // 4 bytes, as expected
printf("%s\n", *str);    // [?]Wrong, [HOW][WHY], format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’[TODO]

同样,使用%sprintf()需要一个字符串(C中的char * ),但是*str实际上是一个char (一个8字节的int )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM