前言:
每天更新一点 :)
概念
指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作
指针的定义
(数据类型*)+指针名=要存入内容的地址;
指针的类型
指针的类型一般由存入地址的内容的数据类型,如
存放整型变量
int a = 10;
int* p = &a;
存放数组类型,如int 数组
int a [10]={1,2,3,4,5,6,7,8,9,0};
int* p = a ;
注意:这里的a表示数组,也表示数组的首元素的地址,所以不需要&运算符。
指针使用
解引用 *
int a = 10;
int* p = &a;
printf("%d",p);//打印a的地址
//指针解引用
printf("%d",*p);//打印a的值10
使用指针代替下标完成数组的遍历打印
int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
int* p = a;
for (int i = 0; i < 10; i++) {
printf("%d", *(p + i));
}
注意:指针的数据类型,表示每次解引用操作指针大小
野指针
没有指向内容,会造成不可知的错误
int* p;
在没有想要指定的内容,可以赋值NULL。
int* p=NULL;
传参
指针传参
#include<stdio.h>
int add(int* x, int* y) {
return *x + *y;
}
int main()
{
int a = 10;
int b = 20;
int* p = &a;
int* p1 = &b;
printf("%d", add(p, p1));
return 0;
}
数组传参
void test(int* arr ){
}
int main(){
int arr[10]={0};
test(arr);//数组名
}
下面的函数调用的10可以省略
void test(int arr[10] ){
}
int main(){
int arr[10]={0};
test(arr);//数组名
}
二维数组
void test(int arr[10][10] ){
}
int main(){
int arr[10][10]={0};
test(arr);//数组名
}
下面函数调用的(*arr)表示二维数组的行,行不能省略
void test(int (*arr)[10] ){
}
int main(){
int arr[10][10]={0};
test(arr);//数组名
}
指针进阶知识点
字符指针
存放字符地址的指针
char a[] = {"abcdef"};
char *p = a;
这里注意不是把字符串存放到指针内
char *p ="abcdef"
数组指针
存放数组地址的指针
说明:数组指针是存放数组地址的指针,&a表示数组a的地址
这里要区分&a和a的区别,&a是整个数组的地址,a是数组名也表示数组a首元素的地址
这里(*a)表示a先和*结合,表示为指针。
区分开指针数组
指针数组是一个存放指针的数组
int a1[] = { 1,2,3,4,5,6 };
int a2[] = { 1,2,3,4,5,6 };
int a3[] = { 1,2,3,4,5,6 };
int* a[] = { a1,a2,a3 };
函数指针
什么是函数指针,顾名思义是存放函数地址的指针。
int add(int x ,int y)
{
return x+y;
}
#include<stdio.h>
int main()
{
printf("%d",add(3,5));
return 0;
}
上面代码中 int add(int x ,int y)我们来拆分下
int = "这个函数的返回类型为int"
add = "函数名"
(int x ,int y) = "函数参数"
就和数组名为数组首元素地址一样,函数名就是函数的地址
int add(int x ,int y)
{
return x+y;
}
#include<stdio.h>
int main()
{
printf("%p",add);
printf("%p",&add);
return 0;
}
运行后结果如下
那么如何将函数地址存放到指针中?
int add(int x ,int y)
{
return x+y;
}
#include<stdio.h>
int main()
{
// 函数指针的定义
int(*padd)(int , int )= add;
// 函数指针调用
printf("%d",padd(10,20));
return 0;
}
运行后结果如下
接下来演示不同的调用
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;
}
#include<stdio.h>
int main()
{
int (*parr[4])(int,int) = { add,sub,mul,div };
for ( int i = 0; i < 4; i++)
{
printf("%d\n", parr[i](10, 20));
}
return 0;
}
qsort函数
#include<stdio.h>
#include<stdlib.h>
int a_compare(const void* e1 ,const void* e2){
return *(int*)e1 - *(int*)e2;
}
int main()
{
//需要排序的数组
int a[10] = { 9,8,7,6,5,4,3,2,1,0 };
int len = sizeof(a) / sizeof(a[0]);
printf("%d\n",len);
qsort(a,len,sizeof(a[0]),a_compare);
int i = 0;
for (i = 0; i < len; i++) {
printf("%d", a[i]);
}
return 0;
}