C语言指针数组VS数组指针

  指针数组和数组指针困惑着许多的C语言初学者,我也一样,经常会将二者混淆。本文将用尽可能简单的方式介绍清楚二者的异同。

C语言指针数组VS数组指针

  what???这俩货难道不是一回事吗???
  不不不其实这俩货差别大着呢。通过名字来区分指针数组是数组,而数组指针是指针,记忆诀窍就是看名字的最后两个自。他们两在定义的时候差不多就是下面这么个情况。
在这里插入图片描述
  为什么int *pa[5]是指针数组而int (*pb)[5]又是数组指针呢?这个是根据C语言的运算符的优先级来决定的1。因为下标运算符优先于取值运算符所以 int *pa[5]是一个数组,又因为当9()和[]同时出现是按从左到右依次运算,所以 int (*pb)[5] 是一个指针,然后再是存放在数组中。

一、指针数组

  指针数组是一个数组,不过这个数组和别的数组有一些不同的是这个数组里面的每一个元素都是指针的数组。同时还需要注意的是指针数组里面的每一个元素的变量类型都和指针的类型一致,也就是说整形的指针数组里面的每一个元素都是整形指针。指针数组的定义方式如下:

#include <stdio.h>
int main()
{
	int a = 1,b = 2,c = 3,d = 4;
	int *e[]={&a,&b,&c,&d};
	int i;
	for(i=0;i<4;i++)
	{
		printf("%d",*e[i]);
	}
	return 0;
}

【运行结果】
在这里插入图片描述
  如果我们不这样定义,按照普通数组的定义方法来定义的话可以通过编译,但是运行的时候就会出错。这是因为指针数组里面的每一个元素存放的都应该的地址。如果我们存储非地址的值虽然可以通过编译,但是不能得到我们想要的结果。

/*#include <stdio.h>
int main()
{
	int *e[]={1,2,3,4};
	int i;
	for(i=0;i<4;i++)
	{
		printf("%d",*e[i]);
	}
	return 0;
} */这是错误示范

【运行结果】
实际效果可能会因不同编译器产生差异
  另外还需要注意的是,我们在使用指针数组存放指向字符串的指针在读取的时候和指向整形变量略有不同,上面我们在读取指向整形变量的指针数组的时候输出是使用的 printf("%d",*e[i]); 而我们在读取指向字符串的地址的指针数组的时候不能这样,因为我们需要读出整个字符串所以不需要再在指针数组前面加上取值运算符。详情见下面是指向字符串的指针数组的示例。

#include <stdio.h>
int main()
{
	char *pa[2]=
	{
		"hello,world!",
		"hello,c!",
	};
	int i;
	for(i=0;i<2;i++)
	{
		printf("%s\n",pa[i]);
	}
	return 0;
 } 

【运行结果】
在这里插入图片描述

二、数组指针

  通过前面的介绍我们已经知道了数组指针是一个指针,这个指针是一个指向数组的指针。.既然提到了数组指针是一个指向数组的指针数组的指针,可能有的小伙伴就要说了这个不是在前面学习指针的时候就学了嘛,其实这两者是不一样的。两者的程序都列在了下面,具体的我们可以来比对一下进行讲解。

程序一:指针数组程序

#include <stdio.h>
int main()
{
	int temp[]={1,2,3,4,5};
	int (*pt)[5]=&temp;
	int i;
	for(i=0;i<5;i++)
	{
		printf("%d\t",*(*pt+i));
	}
	return 0;
}

【运行结果】
在这里插入图片描述
程序二:用指针遍历数组的程序

#include <stdio.h>
int main()
{
	int a[]={1,2,3,4,5};
	int *pa=a;
	int i;
	for(i=0;i<5;i++)
	{
		printf("%d\t",*(pa+i));
	}
	return 0;
}

【运行结果】
在这里插入图片描述
  通过上面的两个程序我们发现,同样是读取数组却有不同的方法。其实第二种方法只能叫做使用指针遍历数组,因为第二个程序的指针其实指向的是数组的第一个元素的地址2,所以我们在读取的时候是使用的 *(pa+1) 。而第一个程序才是真正意义上的数组指针。
  如果看完本文有疑问或者好的建议与欢迎在下方留言评论。


  1. 关于C语言运算符的优先级可参考此文运算符的优先级和结合性↩︎

  2. 因为数组名等于数组的第一个元素的地址等于数组的地址。所以我们在赋值的时候只写了数组名,但是其实他是指向的数组的第一个元素的地址。 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章