前言:
这篇文章用来记录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博客