指针提高
二维数组详解
int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
arr ===> 二维数组第0行地址 ===> arr[0]
arr+1 ===> 二维数组第一行地址 ===> arr[1]
*(arr) ===> 第0行第0列地址 ===> arr[0][0]
*(arr+1)+1 ===> 第1行第1列地址 ===> arr[1][1]
arr[0] ===> *(arr+0) ===> 第0行地址的值 ===> 第0行第0列地址
&arr[0] ===> &*(arr+0) ===> 第0行地址的值的地址 ===> 第0行地址
**arr ===> arr[0][0]值
指针变量做函数参数
如果想在函数内部修改外部变量的值 需要将外部变量的地址传入函数
数组名作为函数参数
数组作为函数的形参,会被编译器优化为指针变量
int arr[] = {10, 20, 30, 40};
printf("%d\n", sizeof(arr)); //16
fun (arr);
void fun(int arr[]){ //int arr[] ===> int *p
printf("%d\n", sizeof(arr)); //8
}
函数的返回值类型为指针类型
将函数内部局部变量通过返回值返回给外部使用
函数的内部局部变量运行完后释放掉了,所以会报段错误,解决办法是加static关键字
p *p &p 区别
p: 一个指针变量的名字,表示此指针变量指向内容的地址
*p: 表示此指针变量指向内容的地址的内容
&P: 指针变量自身的地址
使用双重指针修改变量值
函数指针
函数名 代表函数的入口地址
函数指针: 本质是一个指针变量 只是该变量保存的是函数的入口地址
函数指针变量注意:
函数指针变量不要+1 无意义
不要对函数指针变量取* 无意义
typedef 取别名
typedef int (* FUN_TYPE)(int x, int y); //函数指针类型
FUN_TYPE p = my_add;
由地址找到函数
函数指针 作为函数的参数
my_calc完成加减乘除
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x + y;
}
int mul(int x, int y)
{
return x + y;
}
int div(int x, int y)
{
return x + y;
}
//设计算法,完成加减乘除
int my_calc(int d1, int d2, int (* func)(int, int))
{
return func(d1, d2);
}
int main(int argc, char const *argv[])
{
printf("%d\n", my_calc(1 ,2 ,add));
return 0;
}
标签:arr,变量,int,提高,09,地址,函数指针,指针
From: https://www.cnblogs.com/mzx233/p/17577226.html