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]);
}
我对这一行感到困惑search_names[i] = names[i]++;
这是一个指向char *的指针数组。只是我的实验,我认为它应该是&names[i]++
。因为我想把指针放在那个位置。所以拥有&amp;会告诉我指针指向的地址。
我想我可以这样增加:(names[i]) + i
;
对这一行感到困惑。
答案 0 :(得分:7)
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*
name
是一个包含5个指针的数组,我用方括号及其索引描述了每个指针。加上一个空格,因为指针在我的机器上是4个字节。这是names
初始化之后的情况。右边的单独内存块是一个字节序列,每个0
表示一个0 / NUL字节,而不是字符0
。实现(编译器,链接器和加载器一起工作)的责任是为字符串文字分配内存 - 我假设你使用的所有字符串文字都将聚集在一起,尽管不一定是这种情况。最后,数字0 ... 4表示names
中每个指针指向的位置。
由于您要分配到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
顺便说一句,您允许将字符串文字分配给char*
,但这并不意味着应该。最好声明数组const char *names[SIZE]
。修改编译器为字符串文字指定的内存是未定义的行为,使用const char*
而不是char*
有助于强制执行该操作。
答案 1 :(得分:2)
names []被定义为指向chars的指针数组。因此,names [i]是指向名称中包含的第i个字符串的指针。 search_names []也是指向char的指针数组,因此search_names [i]也是指针。因此,不需要将地址运算符应用于names [i]以使search_names [i]指向与names [i]相同的字符串。希望这能为你澄清一切。
答案 2 :(得分:1)
所以你试图将数组名称复制到search_names中?请注意,name和search_names都是指向字符的指针。 IE,名称[i]是一个指针。
表达式
search_names[i] = names[i]
将search_names [i]的值指定为names [i]。这只是将地址&amp; names [i]的运行时堆栈上的内容放入地址&amp; search_names [i]的单元格中。在这种情况下,它只复制一个指针。它不会复制字符。它只会复制单元格名称[i]中的内容 - 指向一系列字符的第一个字符的指针。
原因
search_names[i] = names[i]++;
相当于
search_names[i] = names[i]
在search_names的上下文中,是因为增量运算符会影响names [i]的值。它在赋值运算符之后具有较低的优先级。因此表达式将在赋值后增加名称[i]。由于names [i]是一个指针,增量会做一些指针运算,这意味着它将指向地址(names [i] + sizeof(char))。