检查第一个代码,如果我写char *tracks[]
而不是char tracks[][80]
,它似乎仍然完全相同。
#include <stdio.h>
#include <string.h>
char tracks[][80] = { "I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town", "Dancing with a Dork",
"From here to maternity", "The girl from Iwo Jima", };
void find_track(char search_for[]) { //'char *search_for' is equivalent.
int i;
for (i = 0; i < 5; i++) {
if (strstr(tracks[i], search_for))
printf("Track %i(Line %i):'%s'\n", i, i + 1, tracks[i]);
}
}
int main() {
char search_for[80];
printf("Search for: ");
scanf("%79s", search_for); //fgets(search_for,80,stdin);
find_track(search_for);
return 0;
}
但请检查第二个代码,如果我尝试使用char juices[][20]
而不是char *juices[]
,编译器会出错,我想知道原因?
#include <stdio.h>
#include <string.h>
void print_reverse(char *s) {
size_t len = strlen(s);
char *t = s + len - 1;
while (t >= s) {
printf("%c", *t);
t = t - 1; //pointer arithmetic
}
puts("");
}
int main() {
char *juices[] = { "dragonfruit", "waterberry", "sharonfruit", "uglifruit",
"rumberry", "kiwifruit", "mulberry", "strawberry", "blueberry",
"blackberry", "starfruit" };
char *a;
puts(juices[6]);
print_reverse(juices[7]);
a = juices[2];
juices[2] = juices[8];
juices[8] = a;
puts(juices[8]);
print_reverse(juices[(18 + 7) / 5]);
puts(juices[2]);
print_reverse(juices[9]);
juices[1] = juices[3];
puts(juices[10]);
print_reverse(juices[1]);
return 0;
}
这很奇怪,因为如果你检查下面的第三个代码,它会给出错误,因为无法更新指向字符串文字的指针。如果事情是这样的,那么在第二个代码char *juices[]
中是指向字符串文字的指针数组,然后juices[2]
是指向"sharonfruit"
的指针,它如何更新?
#include <stdio.h>
int main()
{
char *cards = "JQK"; //you should use char cards[]="JQK";
char a_card = cards[2];
cards[2] = cards[1];
cards[1] = cards[0];
cards[0] = cards[2];
cards[2] = cards[1];
cards[1] = a_card;
puts(cards);
return 0;
}
答案 0 :(得分:3)
char tracks[][80] = { "I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town", "Dancing with a Dork",
"From here to maternity", "The girl from Iwo Jima", };
创建一个char
数组的数组,换句话说,创建一个char
的二维数组,并用每个字符串初始化每个索引。字符串数由编译器在编译期间确定,每个字符串的最大大小为80。
char *tracks[] = { "I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town", "Dancing with a Dork",
"From here to maternity", "The girl from Iwo Jima", };
声明一个char
指针数组。每个指针指向每个字符串文字。指针的数量由编译器在编译期间确定。
字符串文字是不可变的意味着它无法更改。
在使用tracks
的前两个程序中,第一个版本(char tracks[][80]
)和第二个版本(char* tracks[]
)可用,因为字符串未更改且数组不是< EM>分配
在使用juices
的后两个程序中,第一个版本有效(char* juices[]
),因为指针可以更改,即它们指向的位置可以更改,但是第二个版本({ {1}})并不是因为您分配数组。请注意,数组不能可分配 。
要解决此问题,您可以使用char juices[][80]
库中的strcpy
函数来交换string.h
中存储的字符串。请注意,如果要尝试此操作,则需要为变量char juices[][80]
分配内存。
答案 1 :(得分:0)
在C中,“最外层”数组(即第一个[]
)会自动转换为指向第一个元素的指针。
因此,
char tracks[][80]
声明一个指向char
数组(长度为80)的指针。
然而
char *tracks[]
显然是一个char指针数组,这是不同的东西。编译器知道并且不会让你这样做。
此外,这些东西在内存中是不同的:数组复合在内存中肯定是线性的,指针数组可能包含指向内存中任何地方的指针。