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

运行结果:

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

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

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

相关推荐
熬夜学编程的小王12 分钟前
C++类与对象深度解析(一):从抽象到实践的全面入门指南
c++·git·算法
CV工程师小林14 分钟前
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)
数据结构·c++·算法·leetcode·深度优先·剪枝
Dylanioucn17 分钟前
【分布式微服务云原生】掌握 Redis Cluster架构解析、动态扩展原理以及哈希槽分片算法
算法·云原生·架构
繁依Fanyi26 分钟前
旅游心动盲盒:开启个性化旅行新体验
java·服务器·python·算法·eclipse·tomcat·旅游
罔闻_spider36 分钟前
爬虫prc技术----小红书爬取解决xs
爬虫·python·算法·机器学习·自然语言处理·中文分词
Themberfue1 小时前
基础算法之双指针--Java实现(下)--LeetCode题解:有效三角形的个数-查找总价格为目标值的两个商品-三数之和-四数之和
java·开发语言·学习·算法·leetcode·双指针
陈序缘2 小时前
LeetCode讲解篇之322. 零钱兑换
算法·leetcode·职场和发展
-$_$-2 小时前
【LeetCode HOT 100】详细题解之二叉树篇
数据结构·算法·leetcode
大白飞飞2 小时前
力扣203.移除链表元素
算法·leetcode·链表
尘心cx2 小时前
数据结构-栈
数据结构