gcc 4.4.4 c89
#define SIZE 5
char *names[SIZE] = {"peter", "lisa", "simon", "sarah", "julie"};
char *search_names[SIZE] = {0};
size_t i = 0;
for(i = 0; i < SIZE; i++ ) {
search_names[i] = names[i]++;
}
for(i = 0; i < SIZE; i++) {
printf("name to search for [ %s ]\n", search_names[i]);
}
Run Code Online (Sandbox Code Playgroud)
我对这一行很困惑search_names[i] = names[i]++;这是一个指向char*的指针数组.只是我的实验,我认为它应该是&names[i]++.因为我想把指针放在那个位置.所以让&得到指针所指向的地址.
我想我可以增加,以及类似这样的:(names[i]) + i;
只是对这条线感到困惑.
names[i]是一个指针,有类型char*.&names[i]是一个指针names[i],因此具有类型char**.一些记忆的图片:
names for each i, this is where names[i] *points*
|__________________ 0 1 2 3 4
| | | | | | |
| | v v v v v
[0 ][1 ][2 ][3 ][4 ] <gap> peter0lisa0simon0sarah0julie0
^
|_This is where &names[2] points, i.e. this is where names[2] *is*
Run Code Online (Sandbox Code Playgroud)
name是一个由5个指针组成的数组,我用方括号及其索引描述了每个指针.加上一个空格,因为指针在我的机器上是4个字节.这是刚刚names初始化后的情况.右边的单独内存块是一个字节序列,每个字节0指示一个0/NUL字节,而不是字符0.实现(编译器,链接器和加载器一起工作)的责任是为字符串文字分配内存 - 我假设你使用的所有字符串文字都将聚集在一起,尽管不一定是这种情况.最后,数字0 ... 4表示每个指针names所指向的位置.
既然你要分配给a char*,你需要一个char*.或者以另一种方式看,指针指向相同的事情,如果(并且仅当)指针本身具有相同的值.因此,如果你想search_names[i](指针)指向同一个指向的东西names[i],那么search_names[i] = names[i]就完全正确了.
不过,我不知道打算做什么names[i]++.它修改指针names[i].修改指针使其指向不同的东西.在这种情况下,你最终会names[0]指向"eter",names[1]指向"isa",依此类推.
这是你增加每个指针后的内存names:
names
|_____________ 0 1 2 3 4
| | | | | | |
v v v v v v v
[0][1][2][3][4] peter0lisa0simon0sarah0julie0
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你被允许分配一个字符串文字char*,但这并不意味着你应该.声明你的数组会更好const char *names[SIZE].修改编译器为字符串文字指定的内存是未定义的行为,使用const char*而不是char*帮助强制执行该操作.