Hacker_DL 2022-03-17 01:07 采纳率: 16.7%
浏览 209
已结题

关于指针数组怎么赋值的问题

向没有初始化的指针赋值会出问题,这是我知道的。但是每次到代码里面,我就有点糊涂了。比方说,下面这段代码:

char *country[] = {"America", "England", "Australia", "China", "Finland"};

这里,我清楚的。通过使用指针数组,让每一个指针变量的数组元素指向一个字符串。用一张图就可清晰说明。

img


这样访问每一个指针数组的元素,即可获取所指字符串的首址。也即找到了这个字符串。既然找到了,就可以执行相关操作,比方说,就把他们打印出来好了。代码如下:

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;
}

在程序的循环中,每次开一个临时数组,然后让指针数组的一个元素所指向它?虽说理是这个理,但是退出循环以后,这部分局部变量不就被释放了吗?好像也不可行。那么,这个代码才能像上图一个样子呢?

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-03-17 05:33
    关注

    你可以用malloc()函数动态分配内存,将返回的内存地址存到指针数组里。要记得最后用free()函数释放每个动态分配的内存。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月20日
  • 修改了问题 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表