指针数组和数组指针 “朝闻道”知识分享大赛

菜菜菜攻城狮 2023-12-31 14:58:07

这是我参加“朝闻道”知识分享大赛的第五十六篇文章。

 

指针数组和数组指针都是以后面为主体的,指针数组本质是数组,而数组指针本质是指针。

1.数组指针

数组指针:指向数组的指针,也就是说这个指针指向一个数组的首地址,数组可以是任何类型。

#include<iostream>
using namespace std;
 
void test()
{
	int arr[3] = { 1,2,3 };
	//1.定义数组类型,通过数组类型的方式去定义一个数组指针
	typedef int ARR_TYPE[3];
	//通过数组类型去定义一个数组指针pArr
	ARR_TYPE* pArr = &arr;
	for (int i = 0; i < 3; i++)
	{
		cout<<(*pArr)[i]<<endl;     //解引用(*pArr)得到数组的地址,从而输出数组的值
	}
 
	//2.直接定义数组指针
	int(*ppArr)[3] = &arr;
	for (int i = 0; i < 3; i++)
	{
		cout<<(*ppArr)[i]<<endl;   //同理,解引用(*ppArr)得到数组的地址,从而输出数组的值
	}
}
int main(){
    test();
    return 0;
}

 

2.指针数组

指针数组:其本质是数组,数组中的元素都是指针。分为栈区指针数组和堆区指针数组。

 

栈区指针数组:

内存模型中栈是自动申请自动释放,一般是局部变量放在栈中,当作用域结束的时候自动出栈。

#include <iostream>
using namespace std;
 
 
//打印指针数组
//函数参数char** ptr本质上是一个指针数组char* ptr[],在作为函数参数传递的时候会退化为一个指针指向数组的首地址
void printArray(char** ptr,int len){     
 
   
    //len作为参数是因为我需要知道ptr的长度
    //参数有效性验证
    if(NULL==ptr||len<0) return;
 
    for(int i=0;i<len;i++){
        cout<<ptr[i]<<endl;
    }
}
 
//定义并且打印一个栈区的指针数组
void test01(){
    //定义一个栈区的指针数组
    char* ptr[]={"bbbbb","aa","cc"};
    int len=sizeof(ptr)/sizeof(char*);
    cout<<sizeof(ptr)<<endl<<sizeof(char*)<<endl;    //24/8
	//数组中的元素是指针,64位的电脑一个指针占8个字节的空间,而32位的占4个字节
	//所以我的sizeof(char*)是等于8的    
    cout<<"len="<<len<<endl;
    printArray(ptr,len);
}
 
 
 
int main(){
    test01();
    return 0;
}

堆区的指针数组:

和栈区的空间不同,堆区的空间需要手动申请手动释放。

malloc(sizeof(int)*4);申请空间,返回值为void * ,在cpp中有可能需要进行强转类型。

free();释放空间

 

#include<iostream>
#include<cstring>
using namespace std;
 
//开辟一个堆区的指针数组,并为堆区的指针数组中的指针元素开辟新的堆区中的空间
void test02(){
    int len=5;                   //指针数组的长度
    char** ptr=(char**)malloc(sizeof(char*)*len);  //在堆中开辟一个指针数组的空间
 
    if(NULL==ptr) return;
 
    for(int i=0;i<len;i++){
        ptr[i]=(char*) malloc(sizeof(char)*100);//给指针数组中的指针开空间
        if(ptr[i]!=NULL){
            strcpy(ptr[i],"aaa");    //把"aaa"赋值给ptr[i],注意不要丢了头文件
        }
    }
 
    printArray(ptr,len);
 
    //最后就是释放堆中指针数组的空间
 
    for(int i=0;i<len;i++){
        if(ptr[i]!=NULL){
            free(ptr[i]);
            ptr[i]=NULL;
        }
    }
    if(ptr!=NULL){
        free(ptr);
        ptr=NULL;
    }
}
 
 
int main(){
    test02();
    return 0;
}
...全文
81 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

857

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧