没有内存就没有指针。
数组首元素的地址和数组地址是两个不同的概念
数组名代表数组首元素的地址,它是个常量。
//声明了一个数组类型(固定大小内存块的别名)
typedef int (MyArr5)[5];
//定义一个指向数组类型的指针变量
MyArr5 *arry;
int a1[5] = {1,2,3,4,5};
typedef的用法:
1.定义一种类型的别名,而不是简单的宏替换;
typedef char * PCHAR;
多维数组a[i][j] ==> ((a + i) + j)
(a+i)就相当于第i行
(a+i)相当取第i行第一个首元素的地址,因为是二维的数组,(a+i)+j,相当于第i行第j列的地址,((a+i)+j)就相当于给第i行第j列赋值。
二级指针中,a的步长就是一行的长度,即a+1就相当于从第一行指到了第二行。
char * a[] = {"aaa","bbbb","cccc"};
char b[2][3] = {0};
int i = sizeof(a);
int j = sizeof(a);
int k = sizeof(b);
int l = sizeof(b);
int n = sizeof(b);
a代表着数组指针a,b代表着二维数组b,sizeof(a)求出的是整个a的大小。
sizeof(a)则代表了数组指针a,sizeof(b)求出的是二维数组b的大小sizeof(b)求出的是一行的大小,sizeof(**b)一个空间的大小。
char类型占一个字节,int类型占4个字节。
当数组作为函数参数的时候会退化为指针。
void f (int a[5]) ===>void f(int a[]) ====>void f(int *a)
void g(int a[2][3]) ====> void g(int a[][3]) ====>void g(int (*a)[3])
数组参数 等效的指针参数
一维数组 char a[30] 指针 char*
指针数组 char *a[3] 指针的指针char **a
指针数组:char *a[ ] 即是二级指针,相当于char *a ,即数组a[ ]中也全是指针。
数组指针:char (a)[ ] 指向数组的指针,即相当于用一个数组指向一个二维数组的一行的所有元素。