向没有初始化的指针赋值会出问题,这是我知道的。但是每次到代码里面,我就有点糊涂了。比方说,下面这段代码:
char *country[] = {"America", "England", "Australia", "China", "Finland"};
这里,我清楚的。通过使用指针数组,让每一个指针变量的数组元素指向一个字符串。用一张图就可清晰说明。
这样访问每一个指针数组的元素,即可获取所指字符串的首址。也即找到了这个字符串。既然找到了,就可以执行相关操作,比方说,就把他们打印出来好了。代码如下:
for (i=0; i<5; i++) {
printf("%s\n", country[i]);
}
上述,这段指针数组的使用,我还是知道怎么回事的。毕竟,指针数组在声明的时候,就已经“一个萝卜一个坑”得安排好了它们的指向关系——就是写死的。可否灵活一些?我们可否通过指针数组的方式,将用户手动输入的多段字符串,最后根据要求输出出来?
我们不妨通过一个例题来讲讲这个问题。题目如下:
确定奥运参赛国的入场次序
下面主函数调用函数SortString()按奥运会参赛国国名在字典中的顺序对其入场次序进行排序,请问程序错在哪里?
程序如下:
#include <stdio.h>
#include <string.h>
/* 最多的字符串个数 */
#define M 150
void SortString(char *ptr[], int n) {
int i, j;
char *temp = NULL;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (strcmp(ptr[j], ptr[i]) < 0) {
temp = ptr[i];
ptr[i] = ptr[j];
ptr[j] = temp;
}
}
}
}
int main() {
setbuf(stdout, NULL);
int i, countries_count;
char *pStr[M];
printf("How many countries?");
scanf("%d", &countries_count);
/* 读走输入缓冲区中的回车符 */
getchar();
printf("Input their names:\n");
for (i = 0; i < countries_count; i++) {
/* 输入n个字符串 */
gets(pStr[i]);
}
/* 字符串按字典顺序排序 */
SortString(pStr, countries_count);
printf("Sorted results:\n");
for (i = 0; i < countries_count; i++) {
/* 输出排序后的n个字符串 */
puts(pStr[i]);
}
return 0;
}
我的观点是:如果程序要正确运行,那么,指针数组的每一个元素(即:指针),应该指向不同字符串的首址,而不是直接放字符串的实际内容。这个实际内容应该保存在字符串变量中,然后被一个指针数组的一个元素所指向。当然,C语言没有字符串数据类型。只能使用字符数组来代替。难道可以这么写?
for (i = 0; i < countries_count; i++) {
/* 输入n个字符串 */
char temp[10];
gets(temp);
pStr[i] = temp;
}
在程序的循环中,每次开一个临时数组,然后让指针数组的一个元素所指向它?虽说理是这个理,但是退出循环以后,这部分局部变量不就被释放了吗?好像也不可行。那么,这个代码才能像上图一个样子呢?