指针数组、数组指针、数组的区别与联系!

一:基本定义

1.指针数组

char *arr[4] = {"hello", "world", "shannxi", "xian"};
//arr就是我定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址。

(1)这个指针数组有多大呢?答案是16个字节,因为它是一个指针数组。(这是废话,正话下面说) 每当出现这些问题时,脑子里一定要第一时间反应出内存映像图如下:

这里最左侧一列是一个很简陋但能说明意思的内存图,一般情况下,从栈区到代码区,是从高地址到低地址。栈向下增长,堆向上增长。

(2)arr[4]是一个在主函数定义的数组。把它对应到对应到内存中,arr是一个在栈区,有四个元素的数组,而每一个数组又是一个指针,所以说它的四个元素各占四个字节,所以变量arr的大小是16个字节。

那么就有人问了?初始化arr的{“hello”, “world”, “shannxi”, “xian”};的是什么鬼? 
这四个不是什么鬼,他们也存在在内存中,只是跟arr这个变量不在同一段空间,它们被分配在只读数据区,数组arr[4]的四个指针元素,分别存放着这四个字符串的首地址,想象一下,从栈区有四只无形的手指向数据区的空间。arr+1会跳过四个字节,。也就是一个指针的大小 ,这就相当与定义char *p1 = “hello”,char *p1 = “world”,char *p3 = “shannxi”, char *p4 = “xian”,这是四个指针,每个指针存放一个字符串首地址,然后用arr[4]这个数组分别存放这四个指针,就形成了指针数组。

2.数组指针
首先来定义一个数组指针,既然是指针,名字就叫pa。
char (*pa)[4];

(1)char *pa[4]和char (*pa)[4],原来指针数组和数组指针的形成的根本原因就是运算符的优先级问题.

(2)pa是一个指针指向一个char [4]的数组,每个数组元素是一个char类型的变量,所以我们不妨可以写成:char[4] (*pa);这样就可以直观的看出pa的指向的类型,不过在编辑器中不要这么写,因为编译器根本不认识,这样写只是帮助我们理解。

(3)既然pa是一个指针,存放一个数组的地址,那么在我们定义一个数组时,数组名称就是这个数组的首地址,那么这二者有什么区别和联系呢?
char a[4];
a是一个长度为4的字符数组,a是这个数组的首元素首地址。既然a是地址,pa是指向数组的指针,那么能将a赋值给pa吗?答案是不行的!因为a是数组首元素首地址,pa存放的却是数组首地址,a是char 类型,a+1,a的值会实实在在的加1,而pa是char[4]类型的,pa+1,pa则会加4,虽然数组的首地址和首元素首地址的值相同,但是两者操作不同,所以类型不匹配不能直接赋值,但是可以这样:pa = &a,pa相当与二维数组的行指针,现在它指向a[4]的地址。

二:指针数组和数组指针的使用

1.指针数组的应用
(1)指针数组在参数传递时的使用
指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,一个这是指针数组用来接收每个参数(字符串)的地址.

int main(int argc, char *argv[])
此时可以想象内存映像图,主函数的栈区有一个叫argv的数组,这个数组的元素是你输入的参数的地址,指向着只读数据区。

如果是向子函数传参,这和传递一个普通数组的思想一样,不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。因此,指针数组对应着二级指针。

void fun(char **pp);//子函数中的形参
fun(char *p[]);//主函数中的实参(2)指针数组的排序
指针数组的排序非常有趣,因为这个数组中存放的是指针,通过比较指针指向的空间的大小,排序这些空间的地址。函数实现如下:

void sort(char **pa, int n)//冒泡排序
{int i, j;char *tmp = NULL;for(i = 0; i < n-1; i++){for(j = 0; j < n-1-i; j++){if((strcmp(*pa+j), *(pa+j+1)) > 0){tmp = *(pa + j);*(pa + j) = *(pa + j + 1);*(pa + j + 1) = tmp;}}}
}

在函数中定义指针数组,并且打印结果如下:
char *pa[4] = {"abc", "xyz", "opq", "xyz"};

[root@menwen-linux test]# ./test 
abc
ijk
opq
xyz

2.数组指针传参时的使用
数组指针既然是一个指针,那么就是用来接收地址,在传参时就接收数组的地址,所以数组指针对应的是二维数组。

void fun(int (*P)[4]);//子函数中的形参,指针数组

a[3][4] = {0};//主函数中定义的二维数组
fun(a);//主函数调用子函数的实参,是二维数组的首元素首地址

指针数组、数组指针、数组的区别与联系相关推荐

  1. c/C++计算int / int *数组的长度;sizeof(指针),sizeof(数组名)的区别

    1.计算int *数组长度: int arrayVlenth(float *p) {int len = 0;while (*p){p++;len++;}return len; } sizeof(指针) ...

  2. (转)字符型指针变量与字符数组的区别

    (1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符.而系统只为指针变量pc分 ...

  3. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )

    文章目录 前言 一.数组符号 [] 与 指针 * 符号 使用效果 基本等价 二.数组首地址 与 指针 本质区别 前言 参考 [C 语言]指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方 ...

  4. 第十节 字符串指针变量与字符数组的区别(十一)

    用字符数组和字符指针变量都可实现字符串的存储和运算.但是两者是有区别的.在使用时应注意以下几个问题: 1) 字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一 ...

  5. C++数组与指针的区别

    数组与指针的区别 前言 修改内容上的差别 运算符sizeof 可以计算出数组的容量(字节数) sizeof(p),p为指针得到的是一个指针变量的字节数,而不是p所指的内存容量 计算数组和指针的内存容量 ...

  6. 数组名与指向数组的指针之间的联系与区别【数据结构】

    我们遇到一个非常棘手的问题,这个问题就是,对于一堆数据来说,我们进行存储,放到一个指定的仓库当中,先前我们使用数组加加标的形式进行访问仓库当中的元素位置,但是呢,现在我们使用的是一个指针结构,指针指向 ...

  7. C语言学习笔记---数组和指针的区别

      在平时使用数组和指针的时候,感觉他们的使用很类似.那么数字和指针在使用的过程中到底有什么区别呢?   下面通过一个例子来简单分析一下. char str1[] = "abcdef&quo ...

  8. C语言中指针与数组的区别,C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[ ...

  9. 对数组名取地址赋值给数组指针与普通指针的区别

    对数组名取地址赋值给数组指针与普通指针的区别: 以下红色字体的说法是错误的:     使用一级指针来接受&arr,只是表示一个普通的一级指针,     它并没有接收到&arr赋来的跨度 ...

  10. 指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)

    指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别? 前者是一个指针数组,数组大小为4,每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运 ...

最新文章

  1. 华中科大提出EAT-NAS方法:提升大规模神经模型搜索速度
  2. 职场人必读的10个经典励志小故事
  3. R与Python或协同助力机器学习:听Azure ML Studio讲座有感
  4. 二维数组遍历_布尔值数组的状态压缩
  5. 【C#】wpf查找父子节点
  6. mysql 2000安装教程_Win10 64位安装个人版SQL2000图文教程
  7. 后台job批量停用和开启
  8. 悲催的一下午:怎么删除360。。。
  9. 3.Python 进阶知识
  10. 好用的网络拓扑绘制软件亿图图示安装以及使用
  11. PDF文件有密码怎么办?
  12. oracle 中sql实现 同比 环比
  13. 使用枚举实现英文转盲文
  14. 金庸走过,留给马云和阿里巴巴一个“江湖”
  15. 父子组件传值之(子传父)
  16. 面向对象_猫狗案例加入跳高功能分析
  17. 跑象科技CEO 卢山巍:大数据具有“黑魔法”魅力
  18. 结构体内存对齐,默认对齐数,结构体传参
  19. laradock卡在raw.githubusercontent.com,怎么办
  20. Coles客澳市携高品质明星食品第三年亮相中国国际进口博览会

热门文章

  1. 【Linux 操作系统】阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)
  2. Epplus:导出Excel
  3. C# 中泛型与非泛型?(摘)
  4. Android中自定义属性(attrs.xml,TypedArray的使用)
  5. poj2140---herd sums
  6. Delphi FastReport动态加载图片
  7. PHP在各种HTTP服务器上运行模式分析
  8. 给大家推荐个学英语的网站
  9. csdn博客怎么修改字体的大小和颜色
  10. 插入排序之——二分(折半)插入排序(c/c++)