C++学习笔记day24-----番外,类型的理解

指针是一种类型,地址是指针类型的值。
指针类型
在描述指针类型之前,先阐述一下,我对类型的理解。
类型是对内存访问方式的一种描述。
例如,当需要从内存中读取一个char类型的变量的值的时候,会连续的读取一个字节的长度;
取int类型的变量,则需要读取4个连续的字节。
那么就可以理解成,int类型的变量,要求系统访问该变量时,连续的访问4个字节。
而类型本身在内存中是没有任何的体现的。
说白了,内存只知道存和被读取数据。至于用多少个字节存放什么东西,内存是不关心的。

运算符的优先级
要判断一个变量是什么类型的,必须要遵循运算符的优先级!
int (*p)(int,int); p是一个指针类型的变量,用int (int,int)的方式访问*p的内容。函数指针
int *p(int,int); p是一个函数,返回值是一个指针类型,用int方式访问返回值所表示的地址上的内容。
int *p[10]; p是一个数组,数组中的元素是指针类型,每个元素的值所代表的地址用int方式访问。
int (*p)[10]; p是一个指针,p的值所代表的地址,用int[10] 的方式访问。数组指针

刨析一下数组指针

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void){
        char one = 0;
        char *q = &one;
        char **l = &q;
        int num[2][10] = {0};
        int (*p)[10] = num;
        printf("p:%p\n",p);
        printf("p + 1:%p\n",p + 1);
        printf("num + 1:%p\n",num + 1);
        printf("l:%p\n",l);
        printf("l + 1:%p\n",l + 1);
        return 0;
}
-----------------------------------------------
p:0x7ffee32fbdb0
p + 1:0x7ffee32fbdd8
num + 1:0x7ffee32fbdd8
l:0x7ffee32fbd98
l + 1:0x7ffee32fbda0

当对p指针进行加1的时候,为什么加了40个字节?
因为,p是一个指针,当对一个指针进行加1的运算的时候,会先检查*p的访问方式(类型),在这里*p的类型是一个一维数组。
为什么是个一维数组?
int (*p)[10];
p是一个指针,它存放着一个一维数组的首地址。那么*p的结果就是得到一个一维数组的地址。所以它是一个一维数组的类型。

这里有一个问题,对于二级指针q来说,*q存放的也是一个地址,为什么对q加1操作,就是4个字节?
目前我只能这么理解。
内存是不知道这个字节存放的数据是一维数组的地址,还是一个变量的地址。但是操作内存的操作系统是知道的。操作系统会对这个字节存放的数据给与相应访问方式(类型),这个时候操作系统认为一维数组也是一种访问方式。

猜你喜欢

转载自blog.csdn.net/displaymessage/article/details/80205096
今日推荐