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

运行结果:

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

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

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

相关推荐
hie9889414 分钟前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼24 分钟前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield1 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦1 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
xiaolang_8616_wjl1 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
small_wh1te_coder1 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
hqxstudying2 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
挺菜的2 小时前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
sun0077002 小时前
数据结构——栈的讲解(超详细)
数据结构
凌肖战5 小时前
力扣网编程55题:跳跃游戏之逆向思维
算法·leetcode