[C语言]指针和数组

目录

1.数组的地址

2.通过指针访问数组

3.数组和指针的不同点

4.指针数组


1.数组的地址

数组的地址是什么?

看下面一组代码

cpp 复制代码
#include <stdio.h>
int main()
{
int arr[5] = {5,4,3,2,1};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr     = %p\n", arr);
return 0;
}

运行结果:

从上面代码中可以看到数组名和首元素的地址和是一样的

但是有不同的情况

举例:

cpp 复制代码
#include <stdio.h>
int main()
{
	int arr[6] = { 5,4,3,2,1,0 };
	printf("&arr[0]   = %p\n", &arr[0]);
	printf("&arr[0]+1 = %p\n\n", &arr[0]+1);

	printf("arr       = %p\n", arr);
	printf("arr+1     = %p\n\n", arr+1);

	printf("&arr      = %p\n", &arr);
	printf("&arr+1    = %p\n\n", &arr+1);

	return 0;
}

运行结果

可以看到当对&arr[0],arr,&arr都+1时,&arr[0]和arr都移动了4个字节,而&arr移动了16个字节也就是整个数组的长度。

实际上除了&数组名表示整个数组的地址,在使用sizeof(数组名)计算数组的字节数时时,sizeof中的数组名表示的也是整个数组的地址。

总结:数组名表示的是数组首元素的地址,但有两个例外:

1.&数组名

这里的数组名实际上表示的是整个数组的地址

2.sizeof(数组名)

这里的数组名也表示整个数组的地址,计算的是整个数组的字节数。

2.通过指针访问数组

cpp 复制代码
#include <stdio.h>
int main()
{
	int arr[5] = { 0,1,2,3,4, };
	int i = 0;
	int n = 100;
	int* p = arr;
	for (i; i < 5; i++)//通过指针p给数组重新赋值
	{
		*p = n;
		n++;
		p ++;
	}
	for (i = 0; i < 5; i++)//打印数组每个元素
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:

可以看到数组的值可以通过指针被改变

把代码稍作修改:

cpp 复制代码
#include <stdio.h>
int main()
{
	int arr[5] = { 0,1,2,3,4, };
	int i = 0;
	int n = 100;
	int* p = arr;
	for (i; i < 5; i++)//通过指针p给数组重新赋值
	{
		*p = n;
		n++;
		p++;
	}
	for (i = 0; i < 5; i++)//打印地址
	{
		printf("&arr[i] =%d\np+i     =%d\n", &arr[i],p+i);
	}
	return 0;
}

运行结果:

可以看到arr[i]的地址就是指针变量p+1的地址,这也是通过指针更改变数组的每一个元素的原因

3.数组和指针的不同点

cpp 复制代码
int arr[10];
int * p = arr:
p = arr;
//ok

当给p进行赋值时程序会正常执行

cpp 复制代码
int arr[10];
int brr[10];
arr = brr;
//err

当给函数名赋值时程序会报错

总结:赋值表达式的左操作数不能是数组名,但可以是指针变量。

4.指针数组

指针数组就是存放指针的数组

例如:

cpp 复制代码
#include <stdio.h>
int main()
{
	int a = 0;
	int* p = &a;
	int* pp = &a;
	int* ppp = &a;
	int arr[3] = { *p,*pp,*pp };
	printf("%d %d %d\n", arr[0], arr[1], arr[2]);
	return 0;
}

运行结果:

通过上面的代码可以看到通过指针数组的元素,也能访问到指针指向的变量。

注意:指针数组是数组,而数组指针是指针

指针数组是存放指针的数组,数组指针是指向数组的指针。

相关推荐
地平线开发者18 分钟前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考25 分钟前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx4 小时前
CART决策树基本原理
算法·机器学习
Wect4 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱5 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway11 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风12 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect12 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea1 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript