数组与指针:
![](https://i-blog.csdnimg.cn/blog_migrate/a4b042c6be6a6aa3000c90096bd09828.png)
一维数组与指针:
int a[3]={1,2,3};
值
a 数组名,表示一个一维数组
&a 一维数组指针,指向整个一维数组
a+0 是一个int型指针,指向第一个元素
*(a+0) *(a+0)就是a[0],即1
*a *a就是*(a+0),即1
a+n 指向元素a[n]
*(a+n) 就是元素a[n]
二维数组与指针:
int a[3][4];
值 类型
a 数组名,表示一个二维数组 int[3][4]
&a 是一个二维数组指针,指向整个二维数组 int[3][4]*
a[0] 数组名,表示一个一维数组 int[4]
a+0 指向一维数组a[0],a+0是一个一维数组指针 int[4]*
*(a+0) *(a+0)等于a[0],一维数组指针解引用得到一维数组 int[4]
*a *a等于*(a+0) int[4]
a+n 指向一维数组a[n] int[4]*
*(a+n) *(a+n)等于a[n] int[4]
&a[0] 一维数组a[0]取地址,指向整个一维数组 int[4]*
malloc函数
char *p;
p=(char *)malloc(2); 在堆上分配两个内存。然后栈上有个p,p指向这两个内存。
strcpy(p,"hello"); //虽然能够执行,但是越界了。
void *指针 万能指针
free()函数
free(p)时,p必须是malloc的原始值。p++之后再free()是不行的。
free(p);
p=NULL; //把p的值给了free()函数,因为是值传递,并没有把p的地址传给free,所以p的值是改变不了的。 因此有一个标准动作:free之后,p的值是不变的。所以每次free(p)之后,都要加P=NULL。否则就
是野指针。