指针可以说是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.
-
此处a就是数组的首地址
-
a±i指向a[i],其中i必须是整型
-
a[i] 等价于*(a+i)
-
*(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),也会上传相应笔记,感谢关注。
有建议欢迎提出!
欢迎友好交流!