鱼C论坛

 找回密码
 立即注册
查看: 2244|回复: 11

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

[复制链接]
发表于 2020-7-16 16:52:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

        int i;
        for(i=0;i<10;i++)
        {
             printf("%d\n",*((*p)+i));
        }
}
*((*p)+i))是什么意思 尤其是里面的*p的意思 搞不懂哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-16 17:00:40 | 显示全部楼层
p 是一个指向长度为10的整数型组的指针,因此可以推理得到

p 是指针
*p 是指针指向的数组
(*p) + i 仍然是一个指针,数组首地址偏移 i 个相对位置(因为是 int 类型的数组,因此每个相对位置大小为 sizeof(int))
*((*p)+i)) 读取数组索引为 i 的位置保存的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2020-7-16 17:15:34 | 显示全部楼层
赚小钱 发表于 2020-7-16 17:00
p 是一个指向长度为10的整数型组的指针,因此可以推理得到

p 是指针

我可以这样理解吗
array这个数组名刚好是指向数组第一个元素的地址
&array是这个地址的地址
所以
*p的意思是取&array地址上的值 array 就是取地址的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0], address[1], address[2], address[3]);
}
通过将一个 int 指针,转换为 unsigned char 的指针,指针也是数据类型,因此与 int 转 long,float 转 double 一样,指针也可以进行类型转换
在不改变内存布局的前提下,改变了对内存的解析方式
如果代码使用的是 int* 类型,cpu 就会一次读取 4 个字节一起解析
转换为 unsigned char* 类型之后,cpu 就可以一次读取 1 个字节解析.

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 18:00:35 | 显示全部楼层
赚小钱 发表于 2020-7-16 17:35
-------------------------------------------------------------------------------------

emmmm 我刚看到数组指针 你敲的这个代码我完全不懂 你说的意思是不是
p指向数组array的地址 数组array里面有10个int的地址,每个分别存放一个数字,然后*p取的是array地址上的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

1. 指针是一种数据类型
2. 能分析出,指针指向的数据是什么类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-17 17:04:12 | 显示全部楼层
“*”是间接访问运算符,*pi是指pi所指向单元 i 的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-10 15:18:30 | 显示全部楼层
定义了p是指向一维数组的指针,并指向了数组array。
*p是对指针p的取值运算,那么*p就是指向的数组array。
指向的是数组array,说白了*p就是指向array数组的首个元素的地址。

知道了这个后面的就可以理解了吧。 (*p)+i 还是指针,意思是在array数组的首个元素偏移i个单位
,最外面的*是取值运算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[2] = {1,2};
        int (*pb)[2] = &b;
        printf("%d\n", **pb) ; //数组写法不一样
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 18:17:19 | 显示全部楼层
逐句解惑
#include<stdio.h>预定义不用说
void main()主函数不用说
{
        int array[10]={0,1,2,3,4,5,6,7,8,9};定义一个长度为10的整型数组array
        int (*p)[10]=&array;将指针P指向数组array
        int i;定义一个整型变量i
        for(i=0;i<10;i++)for循环
        {
             printf("%d\n",*((*p)+i));打印array的第i个字符
        }
}
应该懂了吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 20:49:54 | 显示全部楼层
          引入数组指针后,我们就有两种方案来访问数组元素了,一种是使用下标,另外一种是使用指针。

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

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

          不管是数组名还是数组指针,都可以使用上面的两种方式来访问数组元素。不同的是,数组名是常量,它的值不能改变,而数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

p 是指针

大佬,明白了数组指针NB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表