c/c++学习--------->数组

来源:互联网 发布:阿里云搭建微信公众号 编辑:程序博客网 时间:2024/04/30 16:01

一.数组安静

1. 数组名是一个常量,原因是在申请内存的时候就已经固定了,内存空间一旦固定,数组名就不能修改。

2. 数组首元素的地址和数组地址是两个不同的概念,例如:int a[200]={0}; a代表的是数组首元素的地址,&a代表的是数组地址, a+1跳向数组的下一个元素,步长为4;&a+1的步长是 ( sizeof(int) * 200)。

3. 数组首元素的地址和数组地址相同。

4.数组类型

typedef int (ArrayType)[5];

ArrayType myArray;   <====>   int myArray[5];

5.指针数组(数组里面存放的是指针)其实数组指针和指针数组看()和[]的优先级,()和[]优先级一样高,但是结合性从左到右,谁写在左边,谁的优先级高。

char *buf[] = {"aaaaa", "fdfsdf", "23432"};  //数组里面存放的指针(指针数组)

6.数组指针(数组指针用于指向一个数组)

typedef int (ArrayType)[5]; //第一种方法

ArrayType myArray;//相当于一级指针

ArrayType *pArray;

pArray = &myArray;//一级指针取地址赋值,pArray 是二级指针

(*pArray)[i] = i;//使用时先还原成一级指针  //指针指向一个数组(数组指针)


typedef int (*pArrayType)[5]; //第二种方法

pArrayType pArray;

int c[5];

pArray = &c;


int (*pMyArray)[5];//直接定义

int c[5];

pMyArray = &c;

7.多维数组本质

多维数组的本质就是数组指针(指向一维数组的指针),步长是往后跳一维的长度。

int a[3][5];

a 和 a+1 相差 ( 5*sizeof(int) )个字节,步长为 ( 5*sizeof(int) )个字节。

(a+i) 代表第i行的地址

*(a+i) 代表第i行首元素的地址

*(a+i) + j 代表第i行第j个元素的地址 <====> &a[i][j]

*(*(a+i) + j)代表第i行第j个元素的值 <====> a[i][j]

推演:a[i] ===> a[0+i] ===> *(a+i)

a[i][j] ===> a[0+i][j] ===> *(a+i)[j] ===> *(a+i)[0+j] ===> *(*(a+i) + j)

a就是指向第i行的地址。

8.多维数组做函数参数退化问题:

char a[30] ====> char *a; char *a[30] ====> char **a; char a[10][30] ====> char (*a)[30];

原创粉丝点击