C-指针数组与数组指针
说实话, C语言真的很让人蛋疼, 它不像面向对象的语言, 我们重心在设计程序上。
而使用C语言, 你不仅要考虑程序的设计, 你还要考虑很多他的使用细节,不然一不小心你怎么死的都不知道。
但是,个人感觉,C语言的魅力是其他任何语言都比不了的!!!, 继续看。。。
- 基本点
- 数组类型
- C语言中数组有自己特定的类型
- 数组的类型有元素类型和数组大小共同定义, 例如 int arr[5]; 对应的数组类型为 int[5]
- 定义数组类型 : typedef type(name)[size], 例如
- typedef int(AINT5)[5] -> AINT5 iArray; //定义了一个数组 int iArray[5];
- typedef float(AFLOAT10)[10]
- 数组指针
- 数组指针用于指向一个数组
- 通过&作用于数组名,我们就可以得到数组的地址
- 可以通过数组类型来定义数组指针 AINT5* pa; //pa是一个指向 int[5] 的指针
- 当然也可以间接定义数组指针 -> int (*p)[5]; //p为指向数组类型为int[5]的指针
- 范例:
- 数组类型
typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
int main()
{
float fArray[10];
int a[5] = {0};
int (*a2)[5] = &a;
AINT5* a1 = a2;
AFLOAT10* pf = &fArray;
printf("%d, %d\n", sizeof(AINT5), sizeof(a));
int i = 0;
for(i=0; i<10; i++)
{
(*pf)[i] = i;
// fArray[i] = i;
printf("%f\n", fArray[i]);
}
- 指针数组
- 指针数组是一个普通的数组
- 指针数组中的每一元素为指针
- 指针数组的定义为 type* pArray[n];
main函数的参数
- main函数的参数可以理解为操作系统调用的函数
- 在执行程序的时候可以向main函数传递参数
- 范例: int main(int argc, char* argv[], char* env[])
- argc: 命令行参数的个数, 包括命令本身
- argv: 命令行参数指针数组
- env: 环境变量的指针数组
- -
指向指针的指针
- 指针变量在内存中会占用一定的内存空间(4 or 8)
- 可以定义一个指针来保存指针变量的地址值(二级指针)
- 二级指针存在的原因是
- 指针本身是变量,对于指针当然也存在传值调用和传址调用
- 二维数组与二级指针
- 二维数组在内存中以一维方式排布
- 二维数组的第一维是一维数组, 二维数组的第二维才是具体值
- 二维数组的数组名同样可以看做指针常量, 还是首元素的地址,例如 &a[0][0] == a
二维数组参数
- 前面已经说过,C语言中的数组参数会退化为指针
- 二维数组参数同样会退化,退化为数组指针
- void g(int a[3][3], int len) -> void g(int a[][3], int len) -> void g(int (*a)[3], int len)