如何理解指针数组?

如何理解指针数组?

话不多说,直接看代码,我这里通过对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字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值