#includeusing namespace std; int main() { int a[2][3] = { 1,2,3,4,5,6 }; cout << *a[0] << endl;//1,相当于a[0][0] cout << *(a[1]+1) << endl;//5 cout << **a << endl;//1 cout << **(a+1) << endl;//4 return 0; }
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.*((ptr + 1)[2])
B.*(*(p + 5))
C.(*ptr + 1) + 2
D.*(*(a + 1) + 2)
【答案】D
A.*((ptr + 1)[2])
ptr是个数组指针,指向的数据类型大小是3个字节,(ptr+1)[2] 相当于 ptr+3,指针+1,地址就加上数据类型的长度,这里是3,ptr+3就是地址+9.,即a[9]=10. a[2]就是a+2,a[2]是*(a+2)
B.*(*(p + 5)) //报错,*的操作数必须是指针 ,*(*(p+5))=*(*(p+5)+0)=a[5][0]不存在
C.(*ptr + 1) + 2 = *ptr+1+2= *ptr+3=&[*(*ptr + 3)]=*(*ptr + 3)的地址
cout << *(*ptr + 3) << endl;//4=a[3]
D.*(*(a + 1) + 2)=a[1][2] bingo
可以调试代码理解一下:
#include3.阅读程序,写出输出。using namespace std; int main() { int a[4][3] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; int(*ptr)[3] = a, *p = a[0]; //cout << a[1][2] << endl;//6 //选项A //cout << *((ptr + 1)[2]) << endl;//10 //选项B //cout << *(*(p + 5)) << endl;//报错,*的操作数必须是指针 //选项C //cout << (*ptr + 1) << endl;//a[0][1]=2的地址值 00F3FAF0 //cout << *(*ptr + 1) << endl;//2 //cout << *(*ptr + 1) + 2 << endl;//a[0][1]+2=2+2=4 //cout << (*ptr + 1) + 2 << endl;//00F3FAF8 cout << *(*ptr + 3) << endl;//4 cout <<*ptr + 3 << endl;//=&*(*ptr + 3)=*(*ptr + 3)的地址 cout << *ptr << endl;//00F3FAF8 //选项D //cout << *(*(a + 1) + 2) << endl;//a[1][2]=6 return 0; }
void fun(char *a, char *b) {
a = b;
(*a)++;
}
int main() {
char c1 = 'A', c2 = 'a', *p1, *p2;
p1 = &c1;
p2 = &c2;
fun(p1, p2);
cout << c1 << 't' << c2<< endl;//A b
return 0;
}
【答案】A b
【解析】a和b都指向c2,所以就没有指针指向c1,所以c1的值没变它的值没有变过,fun中*a=b。p1指向c1,所以main里面 *p1=A。
4.程序阅读,写出输出。void gets(int *p1, int *p2, int *s) {
int t;
t = *p1 + *p2;
s = &t;
cout << *s << endl;
}
int main() {
int a = 3, b = 5, *p1 = &a, *p2 = &b, *s = &a;
gets(p1, p2, s);//8
cout << *s << endl;//3 ,和函数体中的s无关,指向没变
return 0;
}
【答案】83
如有错误,敬请指正,谢谢!!!



