|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
课后作业size23里有个题目问下面的输出值:
#include <stdio.h>
int main()
{
int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p)[10] = &array;
printf("%d\n", *(*(p+1)-6));
return 0;
}
我的理解是*(p+1)不是取值的意思么,但是原array数组长度只有10,此时*11不是取不到值么?
本帖最后由 moppet 于 2018-9-22 11:39 编辑
int 类型 占4个字节 长度就是
array[10] 10个int 就是10 * 4 就是 0-39 这个数组占了40个字节的内存
那就是
array[0] 0-3
array[1] 4-7
array[2] 8-11
array[3] 12-15
array[4] 16-19
array[5] 20-23
array[6] 24-27
array[7] 28-31
array[8] 32-35
array[9] 36-39
array[10] 40-43
4是int 类型的长度 每个元素之间的间隔 就是4
减去6 就等于减去6个int的间隔 所以要6*4 得到减去的总长度
指针每次+1 同等于+4 这1是给我们看的 程序在寻址的时候加的就是4 因为数据间隔是4
首地址 + 数组下标*数据类型长度 = 读取地址
总长度 - 需要减的长度 = 剩余长度 一个元素占4个字节 在除以4 得到的就是当前指向的位置了
*(P + 1)
P定义的事 array[10]
array[10] 是10个int大小 = 40
那么P 的类型大小就是40
和上面同理 指针类型是 int 4长度的 那么指针 + 1 的时候就同等于 + 4
那么这个P 是40的长度
那么P + 1 就是 + 40的长度
36-39是array[9] 第10个元素
此时P指向的就是 40 也就是array[10] 第11个元素
*(*(P + 1) - 6) = 40(总长度) - (6个指针,每个指针指向的位置间隔是4 = 6*4=24)
此时指针指向的是 16 , 16-19 是第4个元素的地址
*(*p + 1) 和 *(*(p+1) )
*(*p + 1)
先看括号里的 *P得到的是array[0]地址 就是首地址了
然后地址 + 1 指向的就是array[1] 那么在定义这个数组的时候 是int类型
为了能正确指向1的位置 所以内部是加了4 为什么是4 上面说了 间隔
*(*p + 1) 然后读取 array[1]里面的内容
*(*(p+1))
还是先看括号里的 是P+1
P是 array[10]类型 总大小是 40
那就是在加1个和P类型一样大小内容出来
就好比 你把1定义成1个房子 这个房子里有N个人
然后你有把这个房子加了 1
*(p+1) 后指向的是 40的位置(;array[10] 40-43 ) 每个元素占4个位置 在除以4 就得出 此时
P指向的地址是array[10]
*(*(p+1) )然后读取这个地址的内容(array[10])
*P + 1 是加一个int的长度
P + 1 是加一个array[0-9]的长度
|
|