乐趣区

关于c:c指针面试题相关问题1

1. 只有在 sizeof(arr),&arr 这两种状况下,arr 示意的整个数组,而 sizeof() 计算传入元素类型的大小
2. strlen 函数的形参为一个常量指针,即 const char*str, 这示意传入 strlen 中的应该是某个地址,且 strlen 在计算长度时
3. char*p=“abcdef”,实际上 p 寄存的是 a 的地址,即字符串首元素的地址


  1. 注:p+0x1 是构造体指针 +1, 跳过一个构造体,所以地址 +20, 又因为是 16 进制,所以,地址为 0x00100014**
    (unsigned long)p+0x1,首先把指针 p 强转为无符号整型,所以 P +0x1 就相当于是一个无符号整数 +1
    (unsigned int*)p+0x1 先把 p 强转成无符号整型指针,所以 p +0x1 相当于跳过一个整型

8.
注:零碎采纳小端存储模式,&a+ 1 跳过了整个数组,如图,指针 ptr 指向数组开端前面的空间,再再将其强转成 int 的指阵类型, 所以 ptr[-1] 等价于 *(ptr-1)即向前跳了一个整型,再解援用
(int)a+ 1 将数组首元素地址转化为一个整型,假如数组首元素的地址为 0x00 00 00 05,强转为整型后 + 1 相当于 5 +1=6,再把 6 强转成地址,即 0x00 00 00 06 即向前跳过一个字节,再解援用 *ptr 为 00 00 00 02,计算机打印时按高地址到低地址打印,所以 %x 为 0x 2 00 00 00


9.
注:逗号表达式,在(x,y)示意的最初一个 y


10.
注:p 的类型为 int(*)[4]

 a 的类型为 int(*)[5],&p[4][2] 等价于 *(*(p+4)+2), 即为第 19 个存储空间,同理 *(*(a+4)+2)为第 23 个存储空间,而地址 - 地址 = 元素个数,所以,&p[4][2]-&a[4][2]=-4,当 - 4 以地址的模式打印的时候,间接打印其补码 11111111111111111111111111111100 转化为 16 进制为 FFFFFFFC


11.
正文:后果为 at,char**pa 二级指针,寄存的是一级指针的地址


12.

 注:char***cp 是一个三级指针,寄存的是数组 cp 的首元素的地址,cp 是一个寄存指针地址的数组,每个数组元素寄存的是指针数组 c 的每个元素的地址,而数组 c 又别离寄存了四个字符串的首元素的地址,并将其作为元素存储。存储示意图如上图所示,1.**++cpp,此时指针 cpp 会指向 cp 数组的第二个元素,即 c +2, 再通过两次解援用找到了字符串“POINT”的首地址,以 %s 的模式打印,便打印整个“POINT”字符串
2.*--*++cpp, 首先指针 cpp 自增 1, 持续向数组 cp 的下一个元素挪动,即指向了 c + 1 元素,解援用,即找到了 c + 1 寄存的地址,即找到了数组 c 的第二个指针元素。接着 -- 操作符,使得找到了 c 数组的第一个指针元素,再解援用,失去了 "ENTER" 的首元素地址,再 + 3 即第四个字符 E 打印字符串,所以后果为“ER”。3.*cpp[-2]+ 3 等价于 **(cpp-2)+3,此时 cpp 自身并不挪动,但 cpp- 2 找到了 cp 数组的 c + 3 元素,解援用,失去 c + 3 指向的元素的地址,即数组 c 的最初一个元素的地址,再次解援用,失去了 c 数组最初一个指针寄存的字符串元素的首地址,最初 +3,即从 S 开始打印字符串,后果为“ST”4.cpp[-1][-1] 等价于 *(*(cpp-1)-1),cpp- 1 找到了 C +2,解援用找到了对应的 c 数组第三个元素的地址,-1,找向 c 数组上一个元素,再解援用,失去了“NEW”的首元素地址,+1, 向后找到了“E”, 从此处开始打印字符串,所以后果为“EW”
退出移动版