有梦想大蜗牛 发表于 2020-7-16 16:52:34

c语言 数组指针的概念问题

#include<stdio.h>
void main()
{
        int array={0,1,2,3,4,5,6,7,8,9};
        int (*p)=&array;

        int i;
        for(i=0;i<10;i++)
        {
           printf("%d\n",*((*p)+i));
        }
}
*((*p)+i))是什么意思 尤其是里面的*p的意思 搞不懂哈

赚小钱 发表于 2020-7-16 17:00:40

p 是一个指向长度为10的整数型组的指针,因此可以推理得到

p 是指针
*p 是指针指向的数组
(*p) + i 仍然是一个指针,数组首地址偏移 i 个相对位置(因为是 int 类型的数组,因此每个相对位置大小为 sizeof(int))
*((*p)+i)) 读取数组索引为 i 的位置保存的数据

有梦想大蜗牛 发表于 2020-7-16 17:15:34

赚小钱 发表于 2020-7-16 17:00
p 是一个指向长度为10的整数型组的指针,因此可以推理得到

p 是指针


我可以这样理解吗
array这个数组名刚好是指向数组第一个元素的地址
&array是这个地址的地址
所以
*p的意思是取&array地址上的值 array 就是取地址的地址

赚小钱 发表于 2020-7-16 17:35:53

有梦想大蜗牛 发表于 2020-7-16 17:15
我可以这样理解吗
array这个数组名刚好是指向数组第一个元素的地址
&array是这个地址的地址


-------------------------------------------------------------------------------------

array这个数组名刚好是指向数组第一个元素的地址

数组名即指向数组的指针,也是指向数组首元素的指针,就是这么设计的,没有什么刚好

array   在语义上是数组首元素的地址
&array 是数组的地址
不要将 &array 理解为地址的地址,因为 array 的值与 &array 的值是相等的。

指针就是一种数据类型:一种表示指向某种类型的变量的类型。
因此,只需要记住
1. 指针类型是一种间接的类型
2. 思考指针指向的是什么

比如下面的代码用来解析 IP 地址
int main() {
    int a = 192 << 24 | 168 << 16 | 50 << 8 | 124;
    unsigned char *address = (unsigned char *) (&a);
    printf("%d.%d.%d.%d\n", address, address, address, address);
}
通过将一个 int 指针,转换为 unsigned char 的指针,指针也是数据类型,因此与 int 转 long,float 转 double 一样,指针也可以进行类型转换
在不改变内存布局的前提下,改变了对内存的解析方式
如果代码使用的是 int* 类型,cpu 就会一次读取 4 个字节一起解析
转换为 unsigned char* 类型之后,cpu 就可以一次读取 1 个字节解析.

有梦想大蜗牛 发表于 2020-7-16 18:00:35

赚小钱 发表于 2020-7-16 17:35
-------------------------------------------------------------------------------------




emmmm 我刚看到数组指针 你敲的这个代码我完全不懂 你说的意思是不是
p指向数组array的地址 数组array里面有10个int的地址,每个分别存放一个数字,然后*p取的是array地址上的值

赚小钱 发表于 2020-7-16 18:48:55

有梦想大蜗牛 发表于 2020-7-16 18:00
emmmm 我刚看到数组指针 你敲的这个代码我完全不懂 你说的意思是不是
p指向数组array的地址 数组array里 ...

1. 指针是一种数据类型
2. 能分析出,指针指向的数据是什么类型

短板 发表于 2020-7-17 17:04:12

“*”是间接访问运算符,*pi是指pi所指向单元 i 的内容

xiaozhangxuexi 发表于 2020-8-10 15:18:30

定义了p是指向一维数组的指针,并指向了数组array。
*p是对指针p的取值运算,那么*p就是指向的数组array。
指向的是数组array,说白了*p就是指向array数组的首个元素的地址。

知道了这个后面的就可以理解了吧。 (*p)+i 还是指针,意思是在array数组的首个元素偏移i个单位
,最外面的*是取值运算。

Cool_Breeze 发表于 2020-8-10 16:43:46

#include <stdio.h>

int main(void)
{
        int a = 1; //数据
        int* p = &a; //数组名 (指针)
        int** p1 = &p; //指向数组名的指针( 指向指针的指针)
        printf("%d\n", **p1);
       
        int b = {1,2};
        int (*pb) = &b;
        printf("%d\n", **pb) ; //数组写法不一样
    return 0;
}

小黑玩C++ 发表于 2020-8-10 18:17:19

逐句解惑
#include<stdio.h>预定义不用说
void main()主函数不用说
{
      int array={0,1,2,3,4,5,6,7,8,9};定义一个长度为10的整型数组array
      int (*p)=&array;将指针P指向数组array
      int i;定义一个整型变量i
      for(i=0;i<10;i++)for循环
      {
             printf("%d\n",*((*p)+i));打印array的第i个字符
      }
}
应该懂了吧~{:10_277:}

风过无痕1989 发表于 2020-8-10 20:49:54

          引入数组指针后,我们就有两种方案来访问数组元素了,一种是使用下标,另外一种是使用指针。

1) 使用下标
         也就是采用 arr 的形式访问数组元素。如果 p 是指向数组 arr 的指针,那么也可以使用 p 来访问数组元素,它等价于 arr。

2) 使用指针
         也就是使用 *(p+i) 的形式访问数组元素。另外数组名本身也是指针,也可以使用 *(arr+i) 来访问数组元素,它等价于 *(p+i)。

          不管是数组名还是数组指针,都可以使用上面的两种方式来访问数组元素。不同的是,数组名是常量,它的值不能改变,而数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。

zhanghaiyang 发表于 2020-10-18 17:17:52

赚小钱 发表于 2020-7-16 17:00
p 是一个指向长度为10的整数型组的指针,因此可以推理得到

p 是指针


大佬,明白了数组指针NB
页: [1]
查看完整版本: c语言 数组指针的概念问题