数组:
数组在定义时,系统分配一个‘连续’的内存空间,注意是一个连续的空间
定义一个int a[10];数是a[0],。。。。a[9];(计算机一般习惯是从0开始)
数组有个默认的头地址a,下一个空间就是a+1,所以当你输入时对a[1],可以这样赋值scanf("%d",a+1);
a a+1
4个字节
所以int a[10],系统给他分配4*10=40个字节的空间
指针:
指针式c/c++的精华,非常有用,也可能有很多朋友,觉得很难学不会,不理解。
其实你加一个操作系统的思想,就好理解了。
在你定义一个变量时,系统会分配一个地址和相应的内存空间,(系统是通过差地址,找到相应内存)
例:int a=9; 那取他的地址 就是 &a;
现在聊聊指针:
定义一个int *p;
这是个指针,你也可以将他理解成地址,系统给他分配4个字节的内存(注:所有类型的指针都是4个字节,因为他只是个地址)
1,
int a=9; //定义一个变量
int *p; //定义一个指针,
p = &a; //a的地址赋值给p , 即p的地址就是a(注:int的地址,只能用int型的指针来接地址)
操作系统是通过地址,来找内存。*p你就可以理解成就是a的内存。*p==a;
2,
int a[10]; //定义一个数组
int *p ; //定义一个指针
p=a; //见上面数组,数组默认一个头指针a,将a赋值给p
//那p的地址就是数组a[]的首地址,所以*p==a[0];*(p+1)==a[1]......
3,
int a[10];
int **p; //定义一个指针的指针
*p=a;
可能指针的指针,让很多朋友苦恼,让我们图形化一下
定义指针的指针其实就是系统分配两个地址,例*p,和p
*p |
p |
*p=a; //将a的地址给*p,(注意这时的*p是个地址),所以*(*p)==a[0];
这里还可以这样
p = &a;//那p就是存放a地址的地址,*p就是a的地址,**p就是a的地址的内存值
由于指针操作时对其指向的内存操作,所以在函数调用时,如果传递的是个地址,对其地址指向内存的值更改。所以函数调用后,
传递的地址的内存值,会相应地改变。
函数返回类型是指针型,那他最后的return的应该是个地址,通过接收该地址,那就可以访问该内存了。