[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;
}

运行结果:

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

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

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

相关推荐
Ven%23 分钟前
【AI大模型算法工程师面试题解析与技术思考】
人工智能·python·算法
天勤量化大唯粉24 分钟前
枢轴点反转策略在铜期货中的量化应用指南(附天勤量化代码)
ide·python·算法·机器学习·github·开源软件·程序员创富
爱学习的小仙女!39 分钟前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ42 分钟前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard1 小时前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
Trouvaille ~1 小时前
【C++篇】把混沌映射成秩序:哈希表的底层哲学与实现之道
数据结构·c++·stl·哈希算法·散列表·面向对象·基础入门
Yeats_Liao2 小时前
MindSpore开发之路(四):核心数据结构Tensor
数据结构·人工智能·机器学习
Darken032 小时前
基于C语言的学习---if语句
c语言·学习·if语句
fab 在逃TDPIE2 小时前
Sentaurus TCAD 仿真教程(十)
算法
天赐学c语言2 小时前
12.19 - 买卖股票的最佳时机 && const的作用
c++·算法·leecode