前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组指针和指针数组

数组指针和指针数组

作者头像
lexingsen
发布2022-02-24 16:03:39
7430
发布2022-02-24 16:03:39
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

一、数组指针 初学C语言的朋友对数组指针这指针数组感到迷惑,分不清,包括我自己,其实是对概念的不清晰以及对数组和指针这两个概念理解的不够深入,下面谈谈我的理解。 数组指针,是一个指针而不是数组。 这个指针具有指向整个数组的能力,保存这个数组的其实地址。 定义数组指针变量

代码语言:javascript
复制
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是数组指针变量

二、指针数组 指针数组,是一个数组,而不是指针。数组中的每一个元素都是一个指针,这些元素构成的集合就是这个数组。

代码语言:javascript
复制
char* str[] = {"China","American","Russia"};
//数组中的每一个都是字符串常量
//字符串常量保存在.data段中的.rodata段
//实际上常量字符串就是一个指针,这个指针指向.rodata对应的常量字符串
这里写图片描述
这里写图片描述

指针数组的应用 完整的main函数原型,int main(int arc,char* argv[],char* envp[]) 其中,两个数组分别保存命令行参数和环境变量(路径)

代码语言:javascript
复制
#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语言选择了效率,因此在实际使用的情况下,尤其是在有数组参与函数调用的情况下,数组的长度需要作为函数的参数传递进去,防止出现错误,损坏堆栈的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档