1.C语言22_行指针和列指针_哔哩哔哩_bilibili
#include<iostream>
using 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
可以调试代码理解一下:
#include<iostream>
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;
}
3.阅读程序,写出输出。
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
如有错误,敬请指正,谢谢!!!