指针和数组
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寄存器的地址指针
错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”