c++指针数组(入门)

article/2025/9/22 3:29:00

指针数组的本质是数组,只是每个数组的元素为指针

32位平台:

char*arr1[4];
int *arr2[4];
short *arr3[4];sizeof(arr1)==168;
sizeof(arr2)==168;
sizeof(arr3)==168;

8.4.1 数值的指针数组

int *arr[4]; 指针数组

int *arr[4]={&num1,&num2,&num3,&num4};

           

int num1=10;
int num2=20;
int num3=30;
int num4=40;
//int arr[4]
//int *p;
int *arr[4]={&num1.&num2,&num3,&num4};
int n=sizeof(arr)/sizeof(arr[0]);
int i;
//遍历输出
for(int i=0;i<n;i++){
cout<<arr[i]<<" "; //10 20 30 40
}
cout<<endl;

                         

8.4.2 字符指针数组

char*arr[4]={"hehehehe","xixixixi","lalalala","hahahaha"};

arr[0]存放的是hehehehe的首元素地址,存放在栈区/全局区(看这个数组是全局还是局部),同时,"hehehehe"被存放在文字长量区。注意:文字长量区的值不可被修改

char*arr[4]={"hehehehe","xixixixi","lalalala","hahahaha"};
int n=sizeof(arr)/sizeof(arr[0]);
int i;
for(i=0;i<n;i++){
cout<<arr[i]<<endl; //这里输出不需要加*号,arr[i]它保存的就是字符串首元素地址,输出结果为 hehehehexixixixilalalala hahahaha}
// cout<<*arr[i]; 输出的就是第0个元素内容,就是 h,x,l,h;// cout<<*(arr[i]+3)<<endl; 这里输出的是字符串第三个元素,e,i,a,a

8.4.3 二维字符数组

char*arr1[4]={"hehehehe","xixixixi","lalalala","hahahaha"};
char arr2[4][128]={"hehehehe","xixixixi","lalalala","hahahaha"};

arr1是在指针数组 存放的是每个字符串的首元素地址

arr2是二维数组    存放的是每个字符串

8.5 指针的指针

int num=10;
int *p=&num;
int **q=&p;

如果想要保存p的地址,则需要两个*号

n级变量可以保存n-1级指针变量的地址

8.6数组指针

int arr[5]={10,20,30,40,50};
int (*p)[5];//数组指针,注意()不能去掉,去掉就和5结合
#include<iostream>
using namespace std;
void test1() {int arr[5] = { 10,20,30,40,50 };int(*p)[5] = &arr;//数组指针cout << "sizeof(p)=" << sizeof(p) << endl;cout << "p=" << p << endl;cout << "p+1=" << p + 1;
}int main() {test1();return 0;}

  

int arr[5]={10,20,30,40,50};
int(*P)[5]=&arr; //数组指针

*p==*&arr==arr;*和&抵消

对数组首地址取*==数组首元素地址

注意:若想取arr[2]内容,必须*(*p+2)=*(*(p+0)+2)==*(p[0]+2)==p[0][2]

8.6.2二维数组和数组指针的关系

int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

arr[0] (值为1,2,3,4)
arr[1]  (5,6,7,8)
arr[2]   (9,10,11,12)

arr[1]=>*(arr+1) //第1行第0列的列地址
&arr[1]=>arr+1 //第1行的行地址
*arr+1=>//第0行第1列的列地址
arr[1]+2=>*(arr+1)+2=>//第1行第2列的列地址
#include<iostream>
using namespace std;
int main() {int  arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };int row = sizeof(arr) / sizeof(arr[0]); //行为3int col = sizeof(arr[0]) / sizeof(arr[0][0]);//列为4int* p = &arr[0][0];int i = 0;for (int i = 0; i < row * col; i++) {  //依次输出arr[i]cout << p[i] << "  ";}return 0;
}

 8.8 指针与函数

8.8.1 指针变量作为函数的参数

如果想在函数内部 修改外部变量的值 需要将外部变量的地址 传递给函数(重要)

案列1 单向传递之值传递

函数内部 不能修改外部变量的值

#include<iostream>
using namespace std;
void setNum01(int data)
{
data=100;
}
void test1(){
int num=0;
setNum01(num);//单向传递之 传值
cout<<"num="<<num<<endl; //输出结果为0.修改不成功
}
int main(int argc,char*argv[])
{
test1();
return 0;
}

案例2 单向传递之传地址

函数内部就可以修改外部变量的值

void setNum02(int *p)//int *p=&num;
{
*p=100;
}
void test2(){int num=0;
setNum02(&num);//单向传递之传地址
cout<<"num="<<num<<endl;  //结果为100
}

8.8.2 一维数组作为函数的参数

函数内部想操作(读或写)外部数组元素,将数组名传递给函数

注意:一维数组 作为函数的形参 会被优化成指针变(面试中常用)

  //void outIntArray(int arr[5], int n) {
// 注意:一维数组作为函数的参数 会被编译器 优化成 指针变量void outIntArray(int *arr, int n) {cout << "内部sizeof(arr)=" << sizeof(arr) << endl; for (int i = 0; i < n; i++) {cout << arr[i] << " ";}
}
void test02() {int arr[5] = {10,20,30,40,50};int n = sizeof(arr) / sizeof(arr[0]);cout << "外部sizeof(arr)=" << sizeof(arr) << endl; //20B//遍历数组:outIntArray(arr,n);// 10 20 30 40 50
}int main() {test02();return 0;}

 8.8.3 二维数组作为函数的参数

函数内部 想操作 函数外部的二维数组 需要将二维数组名 传递给函数

二维数组 作为函数的形参 会被优化成 一维数组

//void outputIntArray(int arr[3][4], int row, int col) {
//二维数组作为函数的形参 会被优化成 一维数组指针void outputIntArray(int  ( * arr)[4],int row,int col){cout << "内部sizeof(arr)=" << sizeof(arr) << endl;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {cout << arr[i][j] << " ";}cout << endl;}
}
void test03() {int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int row = sizeof(arr) / sizeof(arr[0]);int col = sizeof(arr[0]) / sizeof(arr[0][0]);cout << "外部sizeof(arr)=" << sizeof(arr) << endl;//遍历数组outputIntArray(arr, row, col);}int main() {test03();return 0;}

8.8.4 函数的返回值类型为 指针类型

将函数内部的合法地址 通过返回值 返回给函数外部

int* getAddr(void) {int data = 20;//data在函数内部,是局部变量,在函数被调用之后会被释放//*p就等于在访问一个被释放的空间,这时候就会出现段错,操作非法空间return &data; //不要返回普通局部变量的地址
}
void test04() {int* p = NULL;p = getAddr();cout << "p=" << *p;//结果会出现段错,输出不了
}int main() {test04();return 0;}

修改之后为:

int* getAddr(void) {//int data = 20;//data在函数内部,是局部变量,在函数被调用之后会被释放//*p就等于在访问一个被释放的空间,这时候就会出现段错,操作非法空间static int data = 20;//添加局部静态变量staticreturn &data; //不要返回普通局部变量的地址
}
void test04() {int* p = NULL;p = getAddr();cout << "p=" << *p;//20
}int main() {test04();return 0;}

  8.9 函数指针

 函数名 代表函数的入口地址:

函数指针:本质是一个指针变量 只是改变量 保存的是函数的入口地址

int myAdd(int x, int y) {return x + y;
}
void test05() {int(*p)(int x, int y) = NULL;//函数指针和函数入口地址建立关系p = myAdd;//通过p调用myAdd函数(函数+(实参))cout << p(10, 20); //30
}int main() {test05();return 0;}

8.9.2 函数指针变量注意:

函数指针变量不要+1 无意义

不要对函数指针变量取*

8.9.3  函数指针变量 使用typedef定义

int myAdd(int x, int y) {return x + y;
}
void test05() {typedef int(*FUN_abs)(int x, int y);FUN_abs p = NULL;//函数指针和函数入口地址建立关系p = myAdd;//通过p调用myAdd函数(函数+(实参))cout << p(10, 20); //30
}int main() {test05();return 0;}

8.9.4 函数指针作为函数的参数

目的:让算法功能多样化

案例1:设计一个算法,完成加减乘除

int myAdd(int x, int y) {return x + y;
}
int mysub(int x, int y) {return x - y;
}
int mymul(int x, int y) {return x * y;
}
int mydiv(int x, int y) {return x / y;
}
int choice(int x, int y, int (*func)(int, int)) {return func(x, y);
}
void test07() {cout << choice(20, 30, myAdd) << endl;cout << choice(20, 30, mysub) << endl;cout << choice(20, 30, mymul) << endl;cout << choice(20, 30, mydiv) << endl;
}int main() {test07();return 0;}


http://chatgpt.dhexx.cn/article/LUdk4b2U.shtml

相关文章

指针数组、数组指针、数组的区别与联系

指针数组、数组指针、数组的区别与联系&#xff01; 一&#xff1a;基本定义 1.指针数组 char *arr[4] {"hello", "world", "shannxi", "xian"}; //arr就是我定义的一个指针数组&#xff0c;它有四个元素&#xff0c;每个元素是一…

指针数组的用法

指针数组 1、学习目标 掌握指针数组的用法总结与思考 2、指针数组 所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合。 指针数组的一般说明形式&#xff1a; <存储类型> <数据类型> *<指针数组名> [<大小>]指针数组名表示…

数组指针 和 指针数组 的区别

目录 0. 引言1. 数组指针2. 指针数组3. 小结 本文使用运行环境如下&#xff1a; 操作系统&#xff1a;Ubuntu Linux 18.04 64 bit 编译环境&#xff1a;gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 0. 引言 数组指针和指针数组且听之类似&#xff0c;实际完全不同。数组…

C语言(函数指针数组)详解

要了解函数指针数组&#xff0c;可以从三个角度来分析。所谓函数指针数组&#xff0c;从字面意思上来解析&#xff0c;函数指针数组的组成有三个点&#xff0c;函数&#xff0c;指针&#xff0c;数组。首先我们知道&#xff0c;函数指针数组&#xff0c;是一个数组&#xff0c;…

c语言 指针数组

文章目录 前言一、指针数组的定义声明,赋值&#xff1a;二、指针数组的应用&#xff1a;总结 前言 今天我们讲解一下什么是指针数组。 一、指针数组的定义声明,赋值&#xff1a; 什么是指针数组呢&#xff1f; 指针数组 &#xff1a;就是首先定义一个数组&#xff0c;数组里面…

c语言之——指针数组与数组指针

一、指针数组和数组指针的定义 1. 指针数组&#xff1a;是指一个数组里面装着指针&#xff0c;也即指针数组是一个数组&#xff1b; 定义形式&#xff1a;int *a[10]&#xff1b; 说明&#xff1a;[]的优先级高于*&#xff0c;该定义形式应该理解为&#xff1a;int * (a[10]…

关于指针数组与数组指针详解(知识点全面)

1.目录 1.指针数组 2.数组指针 2.它们的区别 1.指针数组 如果一个数组中的所有元素保存的都是指针&#xff0c;那么我们就称它为指针数组。其一般形式为&#xff1a; 数据类型 *数组名[常量表达式][常量表达式]...... ; 它是一个数组&#xff0c;数组的元素都是指针&…

指针数组(指针类型的数组)

顾名思义&#xff1a;指针类型的数组&#xff0c;首先是一个数组&#xff0c;数组元素存储的是指针。(中国的修饰词往往都在前面&#xff0c;而西方修饰词往往是放在后面) 语法如下&#xff1a; 目标类型 数组名称[元素个数] 如&#xff1a;int * p[3] 数组p有3个元素&#x…

数组指针和指针数组的区别

文章目录 前言 一、什么是指针数组&#xff1f; 1.定义 2.声明 3.指针数组的内存示意图 二、什么是数组指针&#xff1f; 1.定义 2.声明 3.内存示意图 三、如何区别指针数组和数组指针&#xff1f; 四、实践理解 总结 前言 这几天老师有问到指针数组和数组指针的区别&#xff…

C语言—指针数组与数组指针

前言&#xff1a; 看到标题的小伙伴可能会有点疑惑&#xff0c;什么是指针数组&#xff0c;数组指针&#xff1f;&#xff1f;傻傻分不清楚&#xff0c;不怕&#xff0c;听我慢慢道来。 正文&#xff1a; 要想弄清楚这两个概念&#xff0c;我们不妨举几个例子&#xff1a; …

指针数组和数组指针的区别及其详解

引言 对于指针数组和数组指针的概念&#xff0c;相信很多人经常会感到迷惑&#xff0c;见到二者一时不能分辨究竟对应哪一个才是对的。接下来我们来分析一下二者区别。 我们来看一下这个示例代码&#xff1a; int *ptr1[10]; int (*ptr2)[10];对于上述代码语句&#xff0c;你…

C语言学习—数组指针和指针数组的区别

前言 本文章对指针数组和数组指针的区别进行了分析介绍 一、数组指针和指针数组的定义 1.数组指针&#xff1a;定义 int (*p)[n]; 由于()的优先级高&#xff0c;首先说明p是一个int类型指针&#xff0c;它是指向一个整型(int)的一维数组&#xff0c;这个一维数组的长度是n&a…

指针数组和数组指针

1.什么是指针数组和数组指针 顾名思义&#xff1a;指针数组是“存放指针的数组”&#xff0c;这个变量是一个数组&#xff0c;用指针修饰&#xff0c;数组中的每个元素都是指针。 数组指针是“指向数组的指针”&#xff0c;这个变量是一个指针&#xff0c;用数组修饰&#xf…

指针数组和数组指针(非常易懂)

指针数组与数组指针 目录&#xff1a; 1.指针与一维数组 2.指针与二维数组 3.指针数组与数组指针 1.指针与一维数组 当定义一个一维数组时&#xff0c;系统会在内存中为改数组分配一个储存空间&#xff0c;其数组的变量名就是数组的首地址。若定义一个指针变量&#xff0c;并…

数组指针和指针数组

首先&#xff0c;理解一下数组指针和指针数组这两个名词&#xff1a; “数组指针”和“指针数组”&#xff0c;只要在名词中间加上“的”字&#xff0c;就知道中心了—— 数组的指针&#xff1a;是一个指针&#xff0c;什么样的指针呢&#xff1f;指向数组的指针。 指针的数…

如何下载风云卫星数据?

如何下载风云卫星数据&#xff1f; 这个是下载风云数据的网址&#xff1a; http://satellite.nsmc.org.cn/PortalSite/Data/Satellite.aspx 1.查找数据 步骤见如图1&#xff1a; 2.选择数据 选择“搜索”以后就就出现图2这个页面&#xff1a;文件名如果被省略了&#xff0…

总结部分SAR卫星及其参数以及SAR卫星发展的趋势

总结国内外失效、在轨和未来发射的SAR卫星及其参数 国内的SAR卫星及其参数 1、高分三号卫星 高分三号卫星(GF-3)于2016年8月10日成功发射&#xff0c;是我国首颗分辨率达到1米的C频段多极化合成孔径雷达(SAR)卫星&#xff0c;自然资源部为其主用户。 GF-3星的分辨率可以达到…

spot卫星介绍与数据下载

1.简介 1.1基本信息 SPOT系列卫星是法国空间研究中心&#xff08;CNES&#xff09;研制的一种地球观测卫星系统&#xff0c;已发射SPOT卫星1-7号。目前CNES已开放spot1-5的卫星数据&#xff0c;可免费下载数据的时间范围为1986年-2014年。 1.2卫星年表 名称信息SPOT-11986年…

空气污染气体卫星数据的下载教程

影响空气质量的主要气体有&#xff1a;二氧化硫、一氧化碳、二氧化氮、可吸入颗粒和臭氧等。我们可以通过Giovanni平台下载空气污染气体的卫星产品数据。 Giovanni平台介绍 Giovanni&#xff0c; 是NASA 旗下的地球科学可视化工具。通过简单的操作&#xff0c;即可将NASA 相关…

GRACE卫星介绍与解密数据下载

1 简介 1.1 基本信息 GRACE &#xff0c;Gravity Recovery and Climate Experiment&#xff0c;由 NASA 和德国宇航中心&#xff08;DLR&#xff09;联合研制&#xff0c;于 2002 年 3 月 17 日在发射。发射 时其预计寿命为 5 年&#xff0c;一直超期服役到2017年坠毁。后继卫…