C语言零基础速通——指针(7分钟搞懂)

​指针可以说是C语言的精髓,指针哪都能指,通过访问地址的方式实现程序的高效性。

1⃣️指针概念


指针:一个变量的地址

此处假设有变量i,同时设i的指针变量为i_pointer

则下图可以协助理解

tips.这里提一下“取内容”和“取地址 ”运算符

1、

&

*

取指针所指向变量的地址

取指针所指向变量的内容

2、&和*为互逆关系

3、列举运用到&和*常见的变量与指针变量的运算:(建议细品)

i_pointer  =  &i  =  &(*i_pointer)

i  =    *i_pointer =    *(&i)


  • 指针变量的定义:(type 1)

  • [存储类型]    数据类型   *指针名;

    eg. 

  •  int  *i_pointer ; // “*”不可以漏掉

tips:

1、每个指针变量定义时,变量名前面必加*,不要漏了,是一个硬性格式

2、指针变量前的数据类型与其所指的变量的数据类型相同

eg.在上例中,i_pointer所指向的变量i必须也是整型


也可以直接赋值:(type 2)

[存储类型] 数据类型  *指针名=初始地址值; 

eg.

int  *i_pointer =10; // “*”不可以漏掉


  • 值传递V.S.地址传递(用例子具体化理解)

  • 值传递:

#include<stdio.h>void swap(int  x,int y){        int  temp;     temp=x;     x=y;     y=temp;}main(){   int a,b;     scanf("%d,%d",&a,&b);      if(a<b)        swap(a,b);      printf("\n%d,%d\n",a,b);}

  • 地址传递:

#include<stdio.h>void swap(int  x,int y){        int  z;     z=x;     x=y;     y=z;}main(){         int a,b;      scanf("%d,%d",&a,&b);      if(a<b)        swap(a,b);      printf("\n%d,%d\n",a,b);}

tips:

这里可以尝试运行一下,会发现值传递的时候a,b并不会互换;地址传递时,当条件符合,ab会互换

此处需要记忆这个特征,是小白常考点


2⃣️指针&数组


  • 一维数组

tips.

  1. 此处a就是数组的首地址

  2. a±i指向a[i],其中i必须是整型

  3. a[i] 等价于*(a+i) 

  4. *(a++) 与 *(++a) 作用不同。前者是先取*a 的值后a加1; 后者是先a加1,再读取*a的值。(易错需要留意)

eg.

#include<stdio.h>main()   {      int a[ ]={1,2,3,4,5,6}, *p;     p=a; //指针变量p指向数组的首地址     *(p+3)+=2;     printf(“%d,%d\n”,*p,*(p+3));    }

大家可以运行一下试试

  • 二维数组

与一维数组类似,就是将一维数组拓宽了一个维度,有了行和列。

eg.以a[3][4]为例(三行四列)

  • a——二维数组的首地址,即第0行的首地址

  • a+i——第i行的首地址

  • a[i]等价于*(a+i)——第i行第0列的元素地址

  • a[i]+j 等价于*(a+i)+j ——第i行第j列的元素地址

  • *(a[i]+j) 等价于 *(*(a+i)+j) 等价于a[i][j]

eg.

#include<stdio.h>main(){       int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};//不要数了,这里十二个元素    int *p;    for(p=a[0];p<a[0]+12;p++) //for循环    {         if((p-a[0])%4==0)   printf("\n");//单个语句的if语句,所以没有大括号      printf("%d  ",*p);    }}

看看这个程序有什么功能呢?

答:输出每行的第一个数,要细品👌

tips:

字符数组往往也是二维数组指针的考察点,需要留意

eg.

#include<stdio.h>main(){     char  *string=“I love technology!”;  printf(“%s\n”,string);  string+=7;  while(*string)  {          putchar(string[0]);    string++;  }}


4⃣️一级/二级指针


二级指针就是指针的套娃

一级指针二级指针
指针变量中存放目标变量的地址指针变量中存放一级指针变量的地址

直接上例子理解

#include <stdio.h>void swap(int **m,int **n)//这函数起到调换位置的作用,用到二级指针{   int *t;    t=*m;    *m=*n;    *n=t;}//常见的调换位置的算法main(){  int a=1,b=2,*p,*q;   p=&a;   q=&b;   swap(&p,&q);   printf("%d,%d\n",*p,*q);}

tips. 这里的两个“*”就亮明了它二级指针的身份

来个表格总结一下常见的指针相关

int  *p[n];

p为n个指向整型数据的指针变量组成的指针数组

int  (*p)[n];

p为指向含n个元素的一维整型数组的指针变量

int *p();

p为返回指针的函数,该指针指向一个整型数据

int (*p)();

p为指向返回整型数函数的指针变量

int **p;

p为指向一个指向整型数据的指针变量

         指针是很搞脑子,需要慢慢琢磨,多加练习。

         之后就开始更新一些常用的应用型例子,或开启C++等新的语言笔记整理。

    • 作者想法

下一章节:经典简单门票费程序(附加章节 1)


p.s. 

        小红书,知乎,CSDN等平台搜索知识薪火站(或youzuos),也会上传相应笔记,感谢关注。

        有建议欢迎提出!

        欢迎友好交流!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值