959
社区成员
发帖
与我相关
我的任务
分享
这是我参加“朝闻道”知识分享大赛的第五十六篇文章。
指针数组和数组指针都是以后面为主体的,指针数组本质是数组,而数组指针本质是指针。
数组指针:指向数组的指针,也就是说这个指针指向一个数组的首地址,数组可以是任何类型。
#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;
}
指针数组:其本质是数组,数组中的元素都是指针。分为栈区指针数组和堆区指针数组。
栈区指针数组:
内存模型中栈是自动申请自动释放,一般是局部变量放在栈中,当作用域结束的时候自动出栈。
#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;
}