指针知识点梳理

本文介绍了C语言中的指针概念,包括指针作为内存地址、指针的定义与类型、解引用操作、数组与指针的关系、野指针处理、参数传递(指针传参和数组传参)以及函数指针的使用。此外,还提到了字符指针、数组指针和函数指针的进阶知识,并通过示例展示了如何使用函数指针进行多函数调用。最后,文章以qsort函数为例,展示了排序功能的实现。
摘要由CSDN通过智能技术生成

前言:

            每天更新一点 :)

概念

        指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值