外贸自建站平台排名,制作ppt的软件是什么,中国万网官方网站,网站建设 营销1. 指针
1.1 一个指针包含两方面#xff1a;a) 地址值#xff1b;b) 所指向的数据类型。
1.2 解引用操作符#xff08;dereference operator#xff09;会根据指针当前的地址值#xff0c;以及所指向的数据类型#xff0c;访问一块连续的内存空间#xff08;大小由指针所…1. 指针
1.1 一个指针包含两方面a) 地址值b) 所指向的数据类型。
1.2 解引用操作符dereference operator会根据指针当前的地址值以及所指向的数据类型访问一块连续的内存空间大小由指针所指向的数据类型决定将这块空间的内容转换成相应的数据类型并返回左值。
有时候两个指针的值相同但数据类型不同解引用取到的值也是不同的例如char str[] {0, 1, 2, 3}; /* 以字符的ASCII码初始化 */ char * pc str[0]; /* pc指向str[0]即0 */ int * pi (int *) pc; /* 指针的“值”是个地址32位。 */
此时pc和pi同时指向str[0]但*pc的值为0即ASCII码值为0的字符而*pi的值为50462976。或许把它写成十六进制会更容易理解0x030201004个字节分别为3,2,1,0。我想你已经明白了指针pi指向的类型为int因此在解引用时需要访问4个字节的连续空间并将其转换为int返回。2. 数组
2.1 数组名和指针
通常我们认为数组名是一个指针常量例如int a[10]; 那么a是一个int * const这种理解是不全面的正确的理解如下
作为右值例如赋值语句右边时数组名可视为指针常量系统自动转换作为左值例如取地址sizeof则不能视为指针。
sizeof(一个数组)返回的是数组大小*每个元素占字节数而sizeof(一个指针返回4。2.2 二维数组
实际上不管是一维还是多维数组都是内存中一块线性连续空间因此在内存级别上其实都只是一维。int a[3][4] {0,1,2,3,4,5,6,7,8,9,10,11}; int ** p; p (int**)a; /* 不做强制类型转换会报错 */
说明1p是一个二级指针它首先是一个指针指向一个int*
2a是二维数组名它首先是一个指针指向一个含有4个元素的int数组
由此可见a和p的类型并不相同如果想将a赋值给p需要强制类型转换。3. 为什么不能将二维数组名传递给二级指针
假如我们将a赋值给pp (int**)a; 既然p是二级指针那么当然可以这么用**p; 这样会出什么问题呢
1首先看一下p的值p指向a[0][0]即p的值为a[0][0]的地址
2再看一下*p的值p所指向的类型是int*占4字节根据前面所讲的解引用操作符的过程从p指向的地址开始取连续4个字节的内容。得到的正式a[0][0]的值即0。
3再看一下**p的值诶报错了当然报错了因为你访问了地址为0的空间而这个空间你是没有权限访问的。4. 二维数组和二级指针相关的参数匹配