指针数组和数组指针


笔记内容已上传个人博客,推荐在个人博客网站观看!

♪(*)欢迎肥来!指针数组和数组指针 | 洛希的智慧之殿堂 (luoxi.work)

指针数组和数组指针

①指针和数组的区别

指针和数组虽然有很多看起来很相似,但是它们还是有区别的,比如以下的一个例子就能够看出它们之间的一个区别。

#include <stdio.h>
int main()
{
	char str[]="I love you!";
		int count = 0;
	while (*str++ != '\0')
	{
		count++;
	}
	pprintf("'I love you!'的字符个数为%d", count);
		return 0;
}

对于以上的代码是来计算"I love you!"这串字符的长度,如果将他进行运行会出

现什么样的结果呢?

image-20221213182834641

我们会惊奇的发现,编译器发生了报错!

这又是为什么呢?还有这里面提到的左值又是什么呢?

左值(lvalue)指的是能够出现在赋值语句的左边的表达式。左值通常是一个变量,或者可以获得变量地址的表达式。这意味着,左值一般具有内存空间,并且能够被改变

右值(rvalue)指的是能够出现在赋值语句的右边的表达式。右值通常是一个字面值,或者是一个计算结果,它们通常不具有内存空间,并且不能被改变。例如,字符串字面值 “hello” 和整数字面值 5 就是右值。

根据上面对于左值和右值的解释我们不难发现。上面代码的错误在于,将数组名当作为了左值! 而数组地址是不可以改变的

所以对于以上的代码我们要引入一个可改变的指针变量来进行代表这个数组名地址,这就不仅让我们想到指针运算中的p++是访问下一个地址这个概念了。

#include <stdio.h>
int main()
{
	char str[]="I love you!";
	char *p =str;//使用指针来间接访问数组的每一个元素
		int count = 0;
	while (*p != '\0')
	{
		count++;
		p++;
	}
	printf("'I love you!'的字符个数为%d", count);
		return 0;
}

最后对于以上的代码的输出结果就是我们想要的结果了。

image-20221214164542612

从这个例子,我不难发现数组和指针最根本的区别就在于,一个代表的是指针变量,是可以改变的值,而另外一个数组名是一个不可改变的地址。

②指针数组和数组指针

(1)如何区分?

对于指针数组和数组指针,相信很多人看到这里就会有点晕了,它俩咋又在一起了捏?其实对于指针数组和数组指针我们只需要看最后两个字就可以辨别出哪个是指针数组而哪个又是数组指针了!

很显然指针数组是存放指针的数组,而数组指针是指向数组的指针。以下我将会给出两种形式来进行判断。

int *p1[5]
int (*p2)[5]

对于以上的两个形式是不是看起来有点懵,究竟哪个是数组指针,而哪个又是指针数组呢?

好了,不卖关子了。其实第一种形式的是指针数组而第二种形式的是数组指针。我们先来了解下指针数组吧!

判断方法:根据运算符的优先级

*p[5]:根据优先级,先看[],则p是一个数组,再结合,这个数组的元素是指针类型,共5个元素,这是“指针的数组”,即指针数组。

(*p)[5]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个数组,数组长度为5,这是“数组的指针”,即数组指针;

(2)指针数组

1.功能图

image-20221222145610949

2.例子

我们从前面可以了解到指针数组是存放指针的数组,那么对于上面的那个形式我们可以理解到,它就是存放整形指针的数组,数组内的每一个元素都是一个整形指针。那么它在代码中应该怎么实现呢?以下一个例子来进行演示一下。

#include <stdio.h>
int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int* p[3] = { &a,&b,&c };//存放a,b,c的地址
    for (int i = 0; i <= 2; i++)
    {
        printf("*p[%d] = %d\n", i, *p[i]);
    }
    return 0;
}

上面的代码就很好的展示了指针数组的功能,以下为输出结果。

image-20221214171924209

但是一般人不会怎么写代码的,所以我们继续看下个例子。从这个例子我相信你就能发现指针数组的魅力所在!

#include <stdio.h>
int main()
{
	char *p[4] = {
	"大佬们好!",
	"欢迎你们能够访问我的个人博客网站",
	"我的博客网站的地址是bg.luoxi.work",
	"Thank you!"
	};
	//用指针数组来进行存放几个字符串也相当于几个字符串数组
	for (int i = 0; i <= 3; i++)
	{
		printf("%s\n", p[i]);
	}
	return 0;
}

对于以上的代码的输出结果如下。

image-20221214173211379

(3)数组指针

1.功能图

image-20221222145702357

2.例子

对于数组指针的话,我们知道它是指向数组的指针,所以我们的代码可以这样写。

#include<stdio.h>
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int(*p)[5] = &a;//a表示数组第一个元素的地址,&a表示整个数组的地址
	for (int i = 0; i <= 4; i++)
	{
		printf("%d\n", *(*p + i));//括号内的*代表这个数组的地址括号外的*代表取这个数组地址的值
	}
	return 0;
}

以上代码的输出结果为:

image-20221222152634240

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值