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的意思 搞不懂哈 p 是一个指向长度为10的整数型组的指针,因此可以推理得到
p 是指针
*p 是指针指向的数组
(*p) + i 仍然是一个指针,数组首地址偏移 i 个相对位置(因为是 int 类型的数组,因此每个相对位置大小为 sizeof(int))
*((*p)+i)) 读取数组索引为 i 的位置保存的数据
赚小钱 发表于 2020-7-16 17:00
p 是一个指向长度为10的整数型组的指针,因此可以推理得到
p 是指针
我可以这样理解吗
array这个数组名刚好是指向数组第一个元素的地址
&array是这个地址的地址
所以
*p的意思是取&array地址上的值 array 就是取地址的地址 有梦想大蜗牛 发表于 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 17:35
-------------------------------------------------------------------------------------
emmmm 我刚看到数组指针 你敲的这个代码我完全不懂 你说的意思是不是
p指向数组array的地址 数组array里面有10个int的地址,每个分别存放一个数字,然后*p取的是array地址上的值 有梦想大蜗牛 发表于 2020-7-16 18:00
emmmm 我刚看到数组指针 你敲的这个代码我完全不懂 你说的意思是不是
p指向数组array的地址 数组array里 ...
1. 指针是一种数据类型
2. 能分析出,指针指向的数据是什么类型 “*”是间接访问运算符,*pi是指pi所指向单元 i 的内容 定义了p是指向一维数组的指针,并指向了数组array。
*p是对指针p的取值运算,那么*p就是指向的数组array。
指向的是数组array,说白了*p就是指向array数组的首个元素的地址。
知道了这个后面的就可以理解了吧。 (*p)+i 还是指针,意思是在array数组的首个元素偏移i个单位
,最外面的*是取值运算。 #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;
} 逐句解惑
#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:} 引入数组指针后,我们就有两种方案来访问数组元素了,一种是使用下标,另外一种是使用指针。
1) 使用下标
也就是采用 arr 的形式访问数组元素。如果 p 是指向数组 arr 的指针,那么也可以使用 p 来访问数组元素,它等价于 arr。
2) 使用指针
也就是使用 *(p+i) 的形式访问数组元素。另外数组名本身也是指针,也可以使用 *(arr+i) 来访问数组元素,它等价于 *(p+i)。
不管是数组名还是数组指针,都可以使用上面的两种方式来访问数组元素。不同的是,数组名是常量,它的值不能改变,而数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。 赚小钱 发表于 2020-7-16 17:00
p 是一个指向长度为10的整数型组的指针,因此可以推理得到
p 是指针
大佬,明白了数组指针NB
页:
[1]