所以我正在玩指针来理解不同的用例,我在这方面没那么有经验,无法围绕一些想法。我会在我遇到问题的地方标记。 请帮我理解指针。
第6行:
为什么我不能将字符串称为数组,因为我认为它是如何存储在内存中的。 如何访问字符串的单个字符?
第7-8行:
当&str
数据类型占用4个字节时,为什么&str + 1
和int
之间存在8个字节的差异
第9,10和12行:
为什么使用*str
引用字符串int
作为输入?
为什么它将单个字节char
转换为int
而不是转换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
答案 0 :(得分:3)
让我们逐行检查:
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);
它是N
的{{3}}。
printf("%d\n", *(str+1));
确实'i' == 105
(再次ASCII code),并指示printf()
使用int
将其打印为%d
。
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]
同样,使用%s
,printf()
需要一个字符串(C中为char *
),但*str
实际上是char
(一个8字节{ {1}})。