指针和数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针和数组相关的知识,希望对你有一定的参考价值。

指针:
 指针在本质上是一个变量;指针需要占用一定的内存空间;指针用于保存内存地址的值
*号的意义:
 在指针声明时,*号表示所声明的变量为指针;
 在指针使用时,*号表示取指针所指向的内存空间中的值 ;
 char *p <==> (char *)p //前面的数据类型是修饰指针指向的空间大小,在32位机器中,指针大小为4字节

技术分享图片

传值调用与传址调用:
 指针是变量,因此可以声明指针参数
 当一个函数体内部需要改变实参的值,则需要使用指针参数
 函数调用时实参值将复制到形参
 指针适用于复杂数据类型作为参数的函数中

数组:
 相同类型的变量的有序集合

技术分享图片
数组的大小:数组在一片连续的内存空间中存储元素,数组元素的个数可以显示或隐式指定
 Int a[5] = {1,2};
 Int b[] = {1,2};
数组地址与数组名:
 数组名代表数组首元素的地址(a);
 数组的地址需要用取地址符&才能得到(&a);
 数组首元素的地址值与数组的地址值相同
 数组首元素的地址与数组的地址是两个不同的概念
数组名的盲点:
 数组名可以看做一个常量指针;
 数组名“指向”的是内存中数组首元素的起始位置;
 在表达式中数组名只能作为右值使用下
 下列场合中数组名不能看做常量指针:
  数组名作为sizeof操作符的参数;数组名作为&运算符的参数

变量 含义
a a为数组首元素的地址;a + 1 <==>(unsigned int)a + sizeof(*a)
&a &a为整个数组的地址; &a + 1 <==>(unsigned int)(&a) + sizeof(*&a)

数组与指针分析 :
 数组的本质:
  数组是一段连续的内存空间;
  空间大小为sizeof(array_type)* array_size;
  数组名可看做指向数组第一个元素的常量指针
 指针的运算 :
技术分享图片
 数组的访问形式:

技术分享图片
 数组参数:
  数组作为函数参数时,编译器将其编译成对应的指针;
  一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来标示数组的大小

void f(int a[]);  ==>void f(int* a);
void f(int a[5]); ==>void f(int* a);  

 指针和数组的对比:

技术分享图片

C语言中的字符串:
技术分享图片
指针数组和数组指针分析:
 定义数组类型:

技术分享图片

技术分享图片

 main函数的参数:
  main函数可以理解为操作系统调用的函数;在执行程序的时候可以向main函数传递参数

技术分享图片
多维数组和多维指针:
 指向指针的指针:
  指针变量在内存中会占用一定的空间;可以定义指针来保存指针变量的地址值

 二维数组与二级指针:

技术分享图片
数组参数和指针参数分析:
 C语言中的数组参数会退化为指针:
 二维数组参数:

技术分享图片
技术分享图片
 c语言中无法向一个函数传递任意的多维数组;
 为了提供正确的指针运算,必须提供除第一维之外的所有维长度限制:
  一维数组参数 – 必须提供一个标示数组结束位置的长度信息
  二维数组参数 – 不能直接传递给函数
  三维或更多维数组参数 – 无法使用
函数与指针分析:
技术分享图片

以上是关于指针和数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

20160211.CCPP体系详解(0021天)

更新:C++ 指针片段

片段中的 EditText 上的空指针异常 [重复]

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

20160211.CCPP体系详解(0021天)