如何理解指针数组?
话不多说,直接看代码,我这里通过对char a[] (字符串数组)和char *a(字符串指针)进行赋值和取值,来间接地解释了指针数组应该如何理解
#include <iostream>
#include <cstring>
using namespace std;
int main(void)
{
//char s[]和char *ptr,都是指向字符串的指针
char s[]="abc";
char const *ptr="abc";
cout<< "char s[]= abc " << endl;
cout<< "char const *ptr= abc " << endl;
cout << endl; //注意:这里的s其实是地址
cout<< "s: " <<s<<endl; // abc
cout<< "(s+1): "<<(s+1)<<endl; // bc
cout<< "(s+2): "<<(s+2)<<endl; // c
cout << endl; //注意:这里的输出方式和上面的不同,这里输出的是值,上面输出的是遍历首到尾地址的值
cout<< "解引用地址0 *s: "<<*s<<endl; // a
cout<< "解引用地址1 *(s+1): "<<*(s+1)<<endl; // b
cout<< "解引用地址2 *(s+2): "<<*(s+2)<<endl; // c
cout << endl; //注意:下面这个&s里面是指针的地址,其实就是指针数组的地址
cout<< "指针数组的首地址: "<<&s<<endl; // 指针数组的首地址
cout << endl; //注意:这里解引用指针数组的首地址并进行加1和加2,取出里面的指针,等于s, (s+1), (s+2)
cout << "*(&s): " << *(&s) << endl; //abc
cout << "*(&s)+1: "<< *(&s)+1 << endl; //bc
cout << "*(&s)+2: "<< *(&s)+2 << endl; //c
cout << endl; //指针数组取出里面的指针,等于s, (s+1), (s+2)
cout<< "&s[0]: " << &s[0] <<endl; // abc
cout<< "&s[1]: " << &s[1] <<endl; // bc
cout<< "&s[2]: " << &s[2] <<endl; // c
cout<< endl;
cout<< "s[0]: "<<s[0]<<endl; // a
cout<< "s[1]: "<<s[1]<<endl; // b
cout<< "s[2]: "<<s[2]<<endl; // c
cout<< endl;
cout<<"*ptr: "<<*ptr<<endl; // a
cout<<"*(ptr+1): "<<*(ptr+1)<<endl; // b
cout<<"*(ptr+2): "<<*(ptr+2)<<endl; // c
cout<<endl; //这里是ptr,它指向值abc
cout<< "ptr: "<<ptr<<endl; // abc
cout<<endl; //这里是指针数组的首地址
cout<< "指针的地址 &ptr: "<<&ptr<<endl; // 地址
cout<< "*(&ptr)+0: "<<*(&ptr)+0<<endl; // abc
cout<< "*(&ptr)+1: "<<*(&ptr)+1<<endl; // bc
cout<< "*(&ptr)+2: "<<*(&ptr)+2<<endl; // c
cout << endl;
cout<<"&ptr[0]: "<<&ptr[0]<<endl; // abc
cout<<"&ptr[1]: "<<&ptr[1]<<endl; // bc
cout<<"&ptr[2]: "<<&ptr[2]<<endl; // c
cout<<endl;
cout<<"*(ptr+0): "<<*(ptr+0)<<endl; // a
cout<<"*(ptr+1): "<<*(ptr+1)<<endl; // b
cout<<"*(ptr+2): "<<*(ptr+2)<<endl; // c
cout << endl;
cout<<"ptr: "<<ptr<<endl; // abc
cout<<"(ptr+0): "<<(ptr+0)<<endl; // abc
cout<<"(ptr+1): "<<(ptr+1)<<endl; // bc
cout<<"(ptr+2): "<<(ptr+2)<<endl; // c
return 0;
}
题目:
**问题:若有语句int a[4][4], int *p, int *q[4]; 且 0<= i < 4, 则错误的赋值是:**
A. p = a
B. q[i]=a[i]
C. p = q[i]
D. p = &a[2][1]
答案:A
原因:
A选项:
p是一级指针 "int*"
a是二维数组,二维数组名可以表示为一个数组指针,"int(*)[4]",被指向数组的每个元素,是一个一维数组。两者的类型不同
B选项:
q[i] 和 a[i] 同为一级指针,正确
C选项:
p 和 q[i] 同为一级指针,正确
D选项:
a[2][1]是一个具体的值,是一个int类型的值,对一个整型数取地址再赋值给一个指针,是可以的,正确
分析
上面这里的*q[4]
就是一个指针数组
对指针数组和数组指针,解释一下
指针数组 char* q[4]
1、它是一个长度为4的数组里,
2、放了4个char*
类型的指针
3、这些指针存放着其对应常量的首地址,
4、大小为4字节(1个char
是1个字节)
数组指针 char (*q)[4]:
1、这是1个指针,
2、指向长度为4的一维数组,即指向一个char[4]
,
3、存放的是一个数组的地址,
4、大小为4字节