gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:46:43 28 4
gpt4 key购买 nike

我正在阅读 Kernighan 和 Richie 的 The C Programming Language 中关于数组和指针的章节。

他们给出了例子:

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

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

然后说:

“因为 s 是一个指针,所以递增它是完全合法的; s++ 对调用strlen 的函数中的字符串没有影响,只是增加strlen 指针的私有(private)副本。这意味着像这样调用

strlen("hello, world");  /* string constant */
strlen(array);           /* char array[100]; */
strlen(ptr);             /* char *ptr; */

一切正常。”

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

最佳答案

要了解像“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]

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

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

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

strlen("Hello World");

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

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

关于c - 将字符串文字作为定义为指针的函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14445705/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com