我正在阅读Kernighan和Richie的C编程语言中有关数组和指针的章节。
他们给出了一个例子:
/* strlen: return length of string s */ int strlen(char *s) { int n; for (n = 0; *s != ' '; s++) n++; return n; }
然后说:
“由于s
是一个指针,递增它是完全合法的; s++
对调用strlen
的函数中的字符串没有影响,只是增加了strlen指针的私有副本。 这意味着像这样的电话
strlen("hello, world"); /* string constant */ strlen(array); /* char array[100]; */ strlen(ptr); /* char *ptr; */
所有的工作。“
除了第一个调用示例之外,我觉得我理解所有这些:为什么或如何将字符串文字"hello, world"
视为char *s
? 这怎么指针? 函数是否将此字符串文字指定为其局部变量*s
的值,然后使用s
作为数组名称/指针?
要理解像“Hello World”这样的字符串是如何转换为指针的,重要的是要理解,字符串实际上是从地址开始并一直移动直到找到NULL
hex数据
这意味着,每个字符串常量(如“Hello World”)都存储在某个内存中
可能性是:
0x10203040 : 0x48 [H] 0x10203041 : 0x65 [e] 0x10203042 : 0x6C [l] 0x10203043 : 0x6C [l] 0x10203044 : 0x6F [o] 0x10203045 : 0x20 [' '] 0x10203046 : 0x57 [W] 0x10203047 : 0x6F [o] 0x10203048 : 0x72 [r] 0x10203049 : 0x6C [l] 0x1020304A : 0x64 [d] 0x1020304B : 0x00 [ ]
因此,当在内存中使用上述值调用此函数时,[左侧是地址后跟’:’,右侧是字符的ascii值]
int strlen(const char *s) { int n; for (n = 0; *s != ′ ′; s++) n++; return n; } strlen("Hello World");
那时,传递给strlen
是值0x10203040
,它是字符数组的第一个元素的地址。
注意,地址是按值传递的。因此, strlen
有自己的“Hello World”地址副本。 从n = 0
,在uptil之后我在内存中找到