c++指针中指针数组、数组指针、指针函数、函数指针等用法的理解与记录

前言:

这篇文章用来记录c++学习过程中遇到的指针方面的问题,会随着学习的深入逐渐补充修改。在对不同指针进行区分的时候,首先应该明白c语言中运算符优先级:C语言中,[]和()的优先级比 * 的优先级高。这表明了在进行运算的时候,要时刻注意优先级区分。


指针数组:

指针数组是数组而不是指针,是一个存放指针数组。也可以理解为数组的所有元素都是指针类型。(图片搬运自指针数组和数组指针的区别及其详解_字符搬运工-蓝天的博客-CSDN博客

指针数组

当我们要声明一个指针数组的方式为:

#include<iostream> 
using namespace std;
int main()
{
	int a = 10, b = 20, c = 30;
	int* array[3] = { &a,&b,&c };
	printf("%p %p %p\n", arr1[0], arr1[1], arr1[2]);
	printf("%d %d %d\n", *arr1[0], *arr1[1], *arr1[2]);
	return 0;
}

 生成结果如下:

 可以看出:

1、int* array[3] 定义了一个指针数组,数组里每一个元素都是一个指针变量。

数组指针:

数组指针可以说成是”数组的指针”,首先明确这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址。(图片搬运自指针数组和数组指针的区别及其详解_字符搬运工-蓝天的博客-CSDN博客

数组指针

 举个例子:int(*p)[10],优先运算()内容,说明p是一个指针变量,然后指向一个大小为10的数组,该数组成员为int类型。

int array[] = {1,2,3};
int(*p) [3] = &array;

这里参考了详解指针数组、数组指针、函数指针_数组函数指针_TangguTae的博客-CSDN博客,列出了我没有考虑到的地方:

在此之前有必要说明一下是array与&array的区别

array是数组中首元素的地址,&array则是整个数组的地址,他们的值是相同的,但是表达的意思不同。array + 1表示下一个元素的地址,但是&array + 1则表示跳过这个数组下一个元素的地址。

上面的代码表示指针p指向的数组有三个元素,且三个元素是int型。
 

int* arr[3] = { 0 };
int* (*p)[3] = &arr;

同理,这段代码,(*p)说明p是指针,[3]说明指向的数组的元素总共3个,int* 说明的是指向每个元素的类型

当使用的时候,可以通过指针进行调节,例如在二维数组中:

int main(){
    int arr[] = {1.2.3};
    int(*p) = &arr;
    for(int i = 0; i < 3; i++){
        printf("%d",(*p)[i]);
    }
    return 0;
}

当我想要表示二维数组任意一个元素的时候,可以使用*(*(arr + i) + j )或者(*(arr + i))[j]

比如:

#include<stdio.h>
int main()
{
	int a[3][4]={ 1,2,3,4,5,6,7,8,9,10,11,12 };
	int(*p)[4];		

	p = a;		//p是一个二维指针,此时指向a[0]

	p[0][0] = a[0][0];		//p相当于a,但p是一个变量
	*(*(p + 2) + 1) = a[2][1];		

	printf("%d %d\n", p[0][0], *(*(p + 2) + 1));
	return 0;
}

指针函数int*p()

任何一个函数int func(int x, int y){};都有自己的地址,func或者&func是其地址。这个时候这个函数就是一个返回值为int的普通函数,如果将其转化为int *func(int x, int y){},这个时候也是一个函数,区别是返回值为指针,返回的指针指向一个整型变量。也就是说,指针函数是个函数,返回值为指针类型。


int main()
{
	int a = 4, b = 5;
	int *pluse;		//指针Pluse用来接收指针函数返回的值
	int* sun(int* p, int* q);		//声明一个指针函数
	pluse = sun(&a, &b);
	printf("%d\n", *pluse);
}

int* sun(int* p, int* q)
{
	int s;
	s = *p + *q;
	return &s;		//返回s的地址
}

的运行结果是9;

函数指针int(*p)()

函数指针是指向函数的指针,表示形式为int(*p)();如若某函数形参变量是int Add(int a,int b),那么就是int(*pf)(int,int)

同时和数组区分,函数名==&函数名,数组名!=&数组名。(数组名取到的是数组首元素的地址而&数组名取到的是整个数组的地址)

具体应用可以参考这篇文章,写得很明白了函数指针与函数指针数组的定义及应用_函数指针数组定义_玩机器的鲁的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值