1、前言
在代码中时长见到 char *p[N]和char (*p)[N]这样的定义,虽然二者长得接近,但意义完全不同,接下来简单了解一下二者的区别。
2、含义
我们先来对比int a[N];a是一个数组,共有N个元素,每个元素都是一个int类型的数据。对于char *p[N]这种定义,[]的优先级要高于*,因此p是一个数组,共有N个元素,每一个元素都是一个char * 类型的数据,这就是指针数组。
我们来对比int a;int *p = a;p是一个指针变量,存放的是一个int类型数据的地址。对于char (*p)[N]这种定义,小括号优先级最高,因此p首先是一个指针变量,存放的是一个char类型的含有N个元素的数组的地址,这就是数组指针。
3、指针数组应用
通过以下代码了解指针数组直接定义声明和赋值的使用:
#include <stdio.h>
int main()
{
char *pstr[3] = {"hello","world","ok"};
printf("%s\n",pstr[0]);
printf("%s\n",pstr[1]);
printf("%s\n\n",pstr[2]);
char *p1 = "hello";
char *p2 = "world";
char *p3 = "ok";
printf("%s\n",p1);
printf("%s\n",p2);
printf("%s\n",p3);
return 0;
}
运行结果:
可以通过下面代码了解数组指针分别定义声明与赋值的使用:
#include <stdio.h>
int main()
{
char *pstr[3];
char str1[10] = {"***aaa***"};
char str2[10] = {"***bbb***"};
char str3[10] = {"***ccc***"};
pstr[0] = str1;
pstr[1] = str2;
pstr[2] = str3;
printf("%s\n",pstr[1]);
printf("%s\n",pstr[2]);
return 0;
}
运行结果:
4、数组指针应用
通过以下代码了解数组指针定义声明和赋值的使用:
#include <stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
int str[2][5] = {1,5,6,7,8,9,0};
int (*p)[5];
p = &arr;
printf("一维数组指针测试:\n");
printf("p[0][0] = %d\n",p[0][0]);
printf("p[0][1] = %d\n",p[0][1]);
printf("**p = %d\n",**p);
printf("*(*p + 1) = %d\n\n",*(*p + 1));
p = str;
printf("二维数组指针测试:\n");
printf("p[0][0] = %d\n",p[0][0]);
printf("p[1][0] = %d\n",p[1][0]);
printf("**p = %d\n",**p);
printf("**(p + 1) = %d\n",**(p + 1));
return 0;
}
测试结果:
我们从头来看,第一个点,定义int (*p)[5] ,表示的是p指向一个int类型的有5个成员变量的一维数组的地址,注意是一维数组的地址而不是数组首个元素的地址,二者值一样,但意义不同,数组指针+1跳跃整个数组的长度,而数组元素指针+1则跳跃单个元素长度。如果还不熟悉的话可以查看之前文章的介绍:https://blog.csdn.net/cesheng3410/article/details/125632505?spm=1001.2014.3001.5502
因为p是整个数组的地址,因此*p即为数组首个元素的地址,即p[0]存储的是首个元素的地址,**p则是首个元素的值,相应的p[0][0]就是首个元素的值,第二个元素则是p[0][1];那p[1]呢?前文提到的,p+1的话跳跃的整个数组的长度,因此p[1]已经是指向整个数组之外了。
第二个点,对于二维数组而言,数组名即为首行元素(单一行可以看为一个一维数组)的地址,因此不需要取址,直接赋值数组名即可,此时p[0]代表第一行元素的地址,p[1]则代表第二行元素的地址,p[0][0]即第一行的第一个元素的值,p[1][0]则为第二行的第一个元素的值。
原文地址:https://blog.csdn.net/cesheng3410/article/details/128204228
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。