cjgank 发表于 2023-2-25 12:40:31

问题:关于指针数组的使用


在使用指针数组的过程又一些疑问不理解,希望求助大佬给予帮助

问题描述:


#include <stdio.h>

int main(void)
{
    char str_01[] = {"《C程序设计》"}, str_02[] = {"《算法与数据结构》"};       
    char *p; // p 是一个拥有两个元素的指针数组

    p = str_01;
    p = str_02;
    for(int i = 0; i < 2; i++)
    {
      printf("第%d本书:%s\n", i+1, *(p+i));
    }
    return 0;
}


`(p+i)` 表示数组的第i元素,`*(p+i)` 表示解引用数组的第i元素的地址。但是让我困惑的一点是 `(p+i)` 不就是 str_01数组的地址吗,为什么还要解引用?

jhq999 发表于 2023-2-25 12:43:38

本帖最后由 jhq999 于 2023-2-25 12:46 编辑

p+0是存有str_01数组地址值的指针
p+1是存有str_02数组地址值的指针
*(p+i)等价于p

cjgank 发表于 2023-2-25 12:50:02

jhq999 发表于 2023-2-25 12:43
p+0是存有str_01数组地址值的指针
p+1是存有str_02数组地址值的指针

对于数组的地址在打印输出时,不是可以直接使用其地址。例如


printf("%s\n", str_01);


既然可以直接使用数组的地址,那么在指针数组的引用就可以

printf("%s\n", p+i);


不知道我这样的理解是否正确?

ExiaGN001 发表于 2023-2-25 13:58:07

cjgank 发表于 2023-2-25 12:50
对于数组的地址在打印输出时,不是可以直接使用其地址。例如




第一个部分错误,第二个正确。
第一个说法对于字符数组/字符串来说其实是错误的,这份代码会直接输出整个字符串
但对于其它类型的数组,你的理解是正确的
第二份代码是正确的,它在运行时会输出i位以后的整个字符串
同样的,scanf也可以这么做(仅限字符串)。

有用请设置最佳答案,谢谢。

jhq999 发表于 2023-2-25 16:17:15

本帖最后由 jhq999 于 2023-2-25 16:18 编辑

cjgank 发表于 2023-2-25 12:50
对于数组的地址在打印输出时,不是可以直接使用其地址。例如




p=str_01//数组p第1个元素储存着字符串指针str_01的值
p+0=&p//p+0是数组p第1个元素的地址,

cjgank 发表于 2023-2-27 09:11:43

jhq999 发表于 2023-2-25 16:17
p=str_01//数组p第1个元素储存着字符串指针str_01的值
p+0=&p//p+0是数组p第1个元素的地址,

我明白了

其实指针数组p有五个连续地址的元素,每个元素的值存放一个指针。
(p+i)只是得到第i个元素,要想得到第i个元素的值就还要解引用*(p+i)。

谢谢解答{:10_323:}
页: [1]
查看完整版本: 问题:关于指针数组的使用