一、数组指针
初学C语言的朋友对数组指针这指针数组感到迷惑,分不清,包括我自己,其实是对概念的不清晰以及对数组和指针这两个概念理解的不够深入,下面谈谈我的理解。
数组指针,是一个指针而不是数组。
这个指针具有指向整个数组的能力,保存这个数组的其实地址。
定义数组指针变量
1.先定义数组类型,根据类型定义指针变量
typedef int A[5];//A是数组类型。元素类型为int,元素个数为10
A* p = NULL;//p是数组指针类型变量
int a[5] = {0};
p = &a;//注意,不能写成 p=a,两者类型是不相同的
//a代表数组首元素的地址,&a代表整个数组的地址
//通过数组指针赋值
for(int i=0;i < 5;++i){
(*p)[i] = i;
}
//sizeof
sizeof(p);\\4 指针变量的大小,在32位下都是4
sizeof(*p);\\20 指针指向空间的大小,即整个数组的大小
2.先定义数组指针类型,根据类型定义变量
typedef int (*A)[5];
//定义指向元素个数为5,元素类型为int的数组的指针类型A
int a[5];
A q = &a;//用类型定义变量
3.直接定义数组指针变量
int a[5] = {1,2,3,4,5};
int (*q)[5] = &a;//q是数组指针变量
二、指针数组
指针数组,是一个数组,而不是指针。数组中的每一个元素都是一个指针,这些元素构成的集合就是这个数组。
char* str[] = {"China","American","Russia"};
//数组中的每一个都是字符串常量
//字符串常量保存在.data段中的.rodata段
//实际上常量字符串就是一个指针,这个指针指向.rodata对应的常量字符串
指针数组的应用
完整的main函数原型,int main(int arc,char* argv[],char* envp[])
其中,两个数组分别保存命令行参数和环境变量(路径)
#include<cstdio>
int main(int argc,char* argv[],char* envp[]){
for(int i=0;i < argc;++i){
printf("argv[%d] = %s\n",i,argv[i]);
printf("envp[%d] = %s\n",i,envp[i]);
}
}
三、防止数组发生越界
数组作为函数参数传递时,会退化为指针。为了提高程序执行的效率,C语言不做数组下标的安全性检查。如果进行了检查当数组数据量非常大时候会显著减低程序的效率,在安全性和高效率之间,权衡利弊之下。C语言选择了效率,因此在实际使用的情况下,尤其是在有数组参与函数调用的情况下,数组的长度需要作为函数的参数传递进去,防止出现错误,损坏堆栈的数据。