c指针面试题相关问题(1)

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

  1. c指针面试题相关问题(1)_第1张图片
  2. c指针面试题相关问题(1)_第2张图片
  3. c指针面试题相关问题(1)_第3张图片
  4. c指针面试题相关问题(1)_第4张图片
    注:p+0x1是结构体指针+1,跳过一个结构体,所以地址+20,又因为是16进制,所以,地址为0x00100014**
    (unsigned long)p+0x1,首先把指针p强转为无符号整型,所以P+0x1就相当于是一个无符号整数+1
    (unsigned int*)p+0x1先把p强转成无符号整型指针,所以p+0x1相当于跳过一个整型

8.c指针面试题相关问题(1)_第5张图片
注:系统采用小端存储模式,&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.c指针面试题相关问题(1)_第6张图片
注:逗号表达式,在(x,y)表示的最后一个y


10.c指针面试题相关问题(1)_第7张图片
注: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.c指针面试题相关问题(1)_第8张图片
注释:结果为at,char**pa二级指针,存放的是一级指针的地址


12.c指针面试题相关问题(1)_第9张图片

注: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”
 




你可能感兴趣的:(c)