将字符串文字作为定义为指针的函数参数传递

Dmi*_*sky 10 c pointers

我正在阅读Kernighan和Richie的C编程语言中有关数组和指针的章节.

他们给出了一个例子:

/* strlen:  return length of string s */
int strlen(char *s)
{
    int n;

    for (n = 0; *s != '\0'; s++)
        n++;
    return n;
}
Run Code Online (Sandbox Code Playgroud)

然后说:

"既然s是一个指针,增加它是完全合法的; s++对调用的函数中的字符串没有影响strlen,但只增加了strlen指针的私有副本.这意味着像这样的电话

strlen("hello, world");  /* string constant */
strlen(array);           /* char array[100]; */
strlen(ptr);             /* char *ptr; */
Run Code Online (Sandbox Code Playgroud)

所有的工作."

除了第一个调用示例之外,我觉得我理解所有这些:为什么或如何将字符串文字"hello, world"视为char *s?这怎么指针?函数是否将此字符串文字指定为其局部变量的值,*s然后s用作数组名称/指针?

Ani*_*nge 13

要理解像"Hello World"这样的字符串如何转换为指针,重要的是要理解,字符串实际上是十六进制数据,从一个地址开始并一直移动直到找到一个 NULL

这意味着,每个字符串常量(如"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 [\0]
Run Code Online (Sandbox Code Playgroud)

因此,当在内存中使用上述值调用此函数时,[左侧是地址后跟':',右侧是字符的ascii值]

int strlen(const char *s)
{
    int n;

    for (n = 0; *s != ?\0?; s++)
        n++;
    return n;
}

strlen("Hello World");
Run Code Online (Sandbox Code Playgroud)

那时,传递给的strlen是值0x10203040,它是字符数组的第一个元素的地址.

注意,地址是按值传递的.因此,strlen它有自己的"Hello World"地址副本.从n = 0我\0在内存中找到的uptil 开始,我递增n并且还有地址s(然后递增到0x10203041)等等,直到它找到\0地址0x1020304B并返回字符串长度.


oua*_*uah 3

"hello, world"

是一个数组char(类型是char[13])。char表达式中的数组的值是指向 的指针char。指针指向数组的第一个元素(即"hello, world"is的值&"hello, world"[0])。