• C语言之指针


    • 指针与变量
    • 指针与一维数组
    • 指针与二维数组

    1、指针与变量

    1.1、指针的概念与定义

    • 指针即地址;
    • 变量的指针即变量的地址;
    • 定义指针的形式一般为:
      • 基本类型 *指针变量名;
      • 例如:int *p;
        • 指针说明符:说明后面的变量是指针变量

    1.2、指针的赋值(赋地址)

    • 1、通过 取地址运算符 赋值
    #include 
    int main()
    {
    	int a,*p;
    	p = &a;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 2、通过另一个指针
    #include 
    int main()
    {
    	int a,*p,*q;
    	p = &a;
    	q = p;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #include 
     
    int main ()
    {
        int var_runoob = 10;
        /**
    		指针即地址;
    		变量的指针即变量的地址;
    	*/
        int *p;              // 定义指针变量
        p = &var_runoob;
     
       printf("var_runoob 变量的地址: %p\n", p);	
       //var_runoob 变量的地址: 0x7ffeeaae08d8
    
    	k = &n;
    	*k = n;
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    指针的定义

    1.3、空指针的定义:

    #include 
    int main()
    {
    	int *p = NULL;	// int *p = 0;
    	/*
    		说明:
    			NULL表示空,其值为 0
    			空指针定义不能引用
    	*/
    	int *q;
    	q = p;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    1.4、指针的操作

    “&”:取 地址 运算符
    “*”:取内容运算符。
    int *p; 定义时 * 为指针说明符

    #include 
    int main()
    {
    	int a = 3,b,*p;
    	p = &a;
    	b = *p + a;
    	printf("%d,%d\n",a,b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.5、二重指针

    用于存储指针的地址
    *p:针对指针变量

    #include 
    int main()
    {
    	int *p = &a;
    	int **p;	//存储的指针p的地址
    	int **p = &p;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    指针的指针

    2、指针与一维数组

    2.1、一维数据的地址

    一维数据的地址

    2.2、一维数组的表达式

    • a <====> &a[0]
    • a + i <====> &a[i]
    • *(a+i) <==⇒ a[i]

    2.3、指向一维数组的指针

    #include 
    int main()
    {
    	int a[] = {12,13,14,2,50,6,7},*p,*q;
    	p = a;	// 相当于 p = &a[0]
    	q = p + 1; 	// 相当于 q = &a[i];
    	return 0;
    	
    	*p = 12;	//这里 *p 的作用是取指针变量 p 的内容
    	*(p + 2) = a[2];	//相当于取值操作,取 a[2] 的值
    	 q[2] = 2;	// 指针指向那个元素,那个元素就是首元素
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.4、指针的自增自减

    指针自增:---------》 后移
    指针自减:---------》左移

    #include 
    int main()
    {
    	int a[] = {5,10,15,20,25},*p = a;
    	*++p;	// 指针右移,10
    	*--p;	// 指针左移,5
    	
    	++*p;	// 11
    	*p++;	// 11
    	*p;		// 15
    	// 靠近结合
    
    	a++;		// 不合法,
    	a+1;		// 相当于 &a[1];		合法
    
    	/*
    		数组名是地址常量,不可进行自增自减运算
    		指针是变量,可以进行自增自减运算。
    	*/
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.5、指针比较大小

    指针比较大小就是所在 位置比较大小
    指针相减就是位置相减
    指针 不可相减

    #include 
    int main()
    {
    	int a[10],*p = a, *q = a + 3;	// *p = &a[0];	*q = &a[3];
    	p > q;	// 0 ,0 > 3
    	p < q;	// 1 ,0 < 3
    	q - p;	// 3 , 3 - 0
    	q + p;	// 指针不可相加
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.6、函数之间对一维数组的引用

    函数和一维数组之间传递参数的方式

    3、指针与二维数组

    3.1、二维数组的指针

    二维数组

    3.2、二维数组地址和内容的引用方式

    *(a+1) + 2:第一行 第二列 的 地址
    ((a+2)+3):第二行 第三列 的内容
    a[1] + 2:第一行 第二列的 地址
    *(a[2] + 3):第二行 第三列的 内容
    *,[] 出现任意一个代表地址;
    出现任意 两个代表 内容;

    3.2.1、一维数组 a 中某元素引用的两种方式

    ①:a[i] ②:*(a+i)

    3.2.2、二维数组 a 中某元素引用的四种方式

    ①:a[i][j]
    ②:((a+i)+j)
    ③:(a[i]+j)
    ④:(
    (a+i))[j]

    3.3、数组指针

    int (*p)[4];		// p 为 int 类型 数组的指针
    
    • 1

    3.4、指针的数组

    int *q[3];		//优先级 () > [] > *  指针数组
    q[0]、q[1]、q[2] 均为 int *;
    
    • 1
    • 2

    3.5、函数指针

    int (*p)();		// 函数指针
    
    • 1

    3.6、指针函数

    int *p();		// 指针函数
    
    • 1

    函数类型可以是任意型,所以返回值也可以是任意类型。

  • 相关阅读:
    Kubernetes 节点异常检测
    uview 1 uni-app表单 number digit 的输入框有初始化赋值后,但是校验失败
    Linux权限
    【构建ML驱动的应用程序】第 10 章 :为模型构建安全措施
    PHP 数组在底层的实现原理
    python毕业设计作品基于django框架 疫苗预约系统毕设成品(8)毕业设计论文模板
    伪原创工具-好用的伪原创软件有哪些特征
    C#小知识
    ansible-playbook之file模块
    坚持用C++刷牛客题(剑指offer专题)
  • 原文地址:https://blog.csdn.net/qq_54864699/article/details/126682901