基本数据类型中,它们的int char double关键字不仅仅是它们的内存的空间大小而且还是它们的访问空间的偏移量;
什么是指针?
多大的内存空间:
指针也需要地址进行保存;它和基本数据类型一样需要一片地址进行保存,它的本质跟前面的访问方式没有什么关系,它的一个本质就是*,它的空间大小是由编译器确定的32位:4字节;64位:8字节;
这个地址这么访问空间:
访问形式 *指针名
数组仅仅是一个申请空间的一个手段而已,我们可以把数组当成指针来用;数组的首地址直接打印出来也是一个指针;我们可以用数组获取值的方式来用到一个地址如何获取值; 因此在c语言中没有那么多的语法
int a1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int a2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *ap = &a1[0];
printf("%d\n", ap[0]);
printf("%d\n", ap[1]);
二级指针:
使用:就像一个柜子里面打开后还有一排抽屉,抽屉打开后就是物件;
int (*k)[3] | 数组指针 | k 是一个指针,指向一个包含3个整数的数组。 |
|---|---|---|
int *k[3] | 指针数组 | k 是一个数组,包含3个元素,每个元素是int*类型的指针。 |
它们的类型(是数组还是指针取决于第一步的运算)从右往左算;
int (*k)[3] ,第一步是算(*k);
int * k[3] ,第一步是算k[3];
二维数组
使用:逻辑上是一种平面的东西;
二维数组是一种逻辑概念,它的目的是方便程序员的代码书写,物理层面它的存储结构仍然是一维的;
在多维数组中最重要的是访问的偏移量;
在这个数组当中[6]的作用远远不如[5],5才是决定访问偏移量的关键;
就是跳过5个int去访问下一行;
char img[3][4];
// char [4](*imgp) = img;按照海牛学长讲的话应该是这样写但是这样写之后,imgp+1就是4个char进行访问了,c语言不支持这种写法;
char (*imgp)[4] = img;
printf("%p,%p,%p\n", img,img + 1,&img[1][2]);
printf("%p,%p",imgp,imgp + 1);
在栈内存中,定义变量是按照从高到低的原则,而且还有字节对齐原则; 字节对齐原则
int a = 0;
int *ap = &a;
printf("%p\n", &a);
printf("%p\n", ap);
printf("%p\n", &ap);
int b = 0;
printf("%p\n", &b);
//000000325bbff72c
//000000325bbff72c
//000000325bbff720
//000000325bbff71c
一个变量名放到等号左边是可写,放到等号右边是可读; [3.1 - 如何描述一个空间]