前言:大家好,这里是YY;此篇博客主要是指针的知识点;包含【一二级指针】【字符指针】【指针数组】【数组指针】【以上知识的实际应用】【函数指针】【函数指针数组】
PS:创作不易,每个知识点都有例题或者图帮助理解;如果对你有帮助,希望能够得到您的关注,赞,收藏,谢谢!
指针:即一个指针变量指向一份普通类型的数据,因为指针保存了那个数据的地址,可以通过解引用找到它(p1找到a)
一级指针图示:
二级指针:即一个指针变量指向指针,因为指针保存了那个数据的地址,可以通过两次解引用找到它(p2解引用找到p1,再解引用找到a)
二级指针图示:
我们可以观察如图所示的情况: 说明:
字符指针指向常量字符串原理:指针指向字符串首元素的地址
理解图示:
PS:为满足“常量字符串不可修改”,需改进:“指针前加上const”
编译器从内存优化的角度处理,数据只会存放到同一个地址
打印原理:打印字符串只需要首元素地址
const char*ps="abcdef";
printf("%s\n",ps);
指针数组类型:类型 * [ n ]
引入:我们知道arr是数组名即首元素地址,那&arr是什么?
结论:
要点:&arr取出的是整个数组的地址,+1后则跳过整个数组
数组指针类型:int(*)[10]
int arr[10]={1,2,3,4,5};
int (*pa)[10]=&arr; 取出的是数组的地址存放到pa中,pa是数组指针变量
PS:数组名是首元素地址:只有两个例外:sizeof(数组名)/&数组名
代码图示:
原理:
原理图示:
代码图示:
PS: int (* ) [5] 是 数组指针 类型, parr3[10] 是 数组 类型
typedef void(*pf_t)(int);
pt_f signal(int,pf_t);
要点:数组传参本质上传的是地址,所以不用专门创建一个数组接受——不用规定大小
代码演示:
void test1(int arr[]);
void test1(int arr[10]; 均可以顺利传参
int main()
{
int arr[10]={0};
test1(arr);
test1(arr);
}
代码演示:
void test1(int*arr);
int main()
{
int arr[10]={0};
test1(arr);
}
要点:二维数组的列不能省略,即“列”需要规定大小
代码演示:
正确写法
void test1(int arr[3][5]);
void test1(int arr[ ][5]);
错误写法:
void test1(int arr[ ][ ]);
void test1(int arr[3][ ]);
int main()
{
int arr[3][5]={0};
test1(arr);
}
要点:必须要用数组指针接收
代码演示:
正确写法:
void test1(int(*arr)[5]);
错误写法:
void test1(int*arr);
int main()
{
int arr[10]={0};
test1(arr);
}
函数指针类型:int(*pf)(int,int)
函数指针数组:int(* pfArr[4] )(int,int)
函数指针数组作用:可以存放多个【参数相同,返回类型相同】的函数的地址
使用演示: