【极为基础】令人头晕的指针问题汇总

1.已知:char s[10], *p=s,则在下列语句中,错误的语句是 。

 A) p=s+5   
 B) s=p+s   
 C) s[2]=p[4]   
 D) *p=s[0]

A: p=s+5 表示指针p向后移动5个字符,指向s[5]
B:s是数组名,在c语言中数组名是常量,不能给数组名赋值
C: 指针指向数组后,p[4]就是s[4] 所以s[2]=p[4]就是 s[2]=s[4] 正常的赋值语句。
D:s[0]和s都表示数组首地址,因此正确。

2.已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},
有int (*ptr)[3]=a,*p=a[0]。以下正确表示a[1][2]的表达式是。

A.*(*(a+1)+2)    
B.*(*(p+5)) 
C.(*ptr+1)+2
D.*((ptr+1)[2])

这道题首先分清楚两个概念 数组指针 指针数组
数组指针:int (*ptr)[3]=a; ptr是指向步长为3的数组的指针变量。
eg:

数组指针 指针数组
int (*ptr)[3] = a int *p[3] = a
指向步长为3的数组的指针变量 数组元素是3个int型指针,
ptr->1,2,3;ptr+1->4,5,6;ptr+2->7,8,9;… p->1,2,3,4;p->5,6,7,8;…
A:二维数组中a与a[0]地址相同,*a表示的是第0行元素首地址,
   *a表示a[0]**a表示a[0][0]。
   对于A项*(*(a+1)+2)*(a+1)首先取到第1行元素,
   在此基础上向后移动两个元素,即a[1][2];为正确选项
B:*(*(p+5)) ,*p指向二维数组的首元素,
   *(p+5)从a[0][0]向后5个地址取到a[1][2]=6;
C:(*ptr+1)+2,*ptr+1即第0行第1列元素的地址,
  之后再加2表示a[0][3]=4元素地址
D:*((ptr+1)[2]),首先ptr+1[2]等价于ptr+1+2=ptr+3,
   ptr+3表示的是a[3][]行元素首地址a[3][0]*取地址后为10.

3.设有如下定义:char *aa[2]={“abcd”,“ABCD”};则以下说法中正确的是( D)。

A.aa数组成元素的值分别是"abcd"和ABCD"
B.aa是指针变量,它指向含有两个数组元素的字符型一维数组
C.aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
D.aa数组的两个元素中各自存放了字符’a’和’A’的地址

4.有如下函数声明语句

float min(floatfloat

定义一个指向此类函数的指针的语句为float (*p)()
float *p()定义了返回值为float型指针的函数。
将此函数赋给这个指针的语句是p=min
此指针调用此函数的语句*p(a,b)

5.字符数组与字符指针解析

你可能感兴趣的:(学习笔记)