目录
一、初识指针
说到指针,对于初学者来说可能会有些陌生,但是提到scanf()函数中的&相信大家都有所耳闻。在我们开始接触scanf()函数的时候我们就知道,&代表的变量的地址。那什么是地址呢?就是变量的内存位置。并且指针也包括空指针和野指针。
1.空(NULL)指针和野指针
空指针就给指针变量赋值为NULL,而野指针就是不给指针变量赋值。
举个例子,就像是我们桌面的快捷方式,他就属于一个指针,而它指向的地址就是途中红框里的地址。我们删除桌面快捷方式(指针),并不影响该软件的运行,若是我们删除了目标地址里的文件,该指针就变成了空指针,就失去了意义。
假设医生给病人看病(画工粗糙),医生就相当于一个指针,医生指向病人,跟病人对话。然而假如患者1缺失,挂了号但是没来,这也就变成了空指针,医生也就空闲下来了。
但是如果是野指针,它不像空指针什么都不输出,他会随意输出一个值。可以比作一个医生,没有病人找他看病,我就出去随便找人看病,然而他找的都是没病的人,就这是野指针。
2.指针变量
指针变量的一般形式:类型说明* 变量名 = &变量名;
例如:int* p = &a;
*表示该变量是一个指针变量,&a就是变量a的地址。同样也可以先定义指针再赋值,但是我建议如果先定义指针再赋值的话,定义指针的时候先给指针赋空值,也就是NULL,不然后面忘了赋值,指针就变成了野指针,随便给人看病(doge
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int age = 100;
int* p = &age;
printf("age adress=%p\n", &age);
printf("p=%p\n", p);
printf("age=%d\n", *p);
printf("age=%d", age);
return 0;
}
正如上图所见,输出地址我们用的是%p,输出的前两行结果是相同的,后两行结果是相同的。显然,在这个程序里输出%age和p的结果都是age的地址,输出age和*p都是age的值。
*符我们就可以把它当作双击,双击桌面上的快捷方式(指针),就能得到指针所指的变量的值。所以输出*p就相当于输出age的值。
3.指针的自增自减
以上面程序为例,输出指针变量p结果是:00000082CC0FF564,如果指针变量p再运行p++;指令后再次输出p,结果将是00000082CC0FF568,相比之前多了4,由于指针变量p的类型是int,所以这个4就是int所具有的4个字符。
4.数组与指针
int *p,a[10];
p = a;
int *p,a[10];
p = &a[0];
int *p,a[10];
p = a[0];
就如上图,三组所表达的含义完全相同,数组a[0]的地址也就是数组a的地址,并且可以省略&,不管是一维数组还是多维数组都是成立的,但这只有数组成立。
5.字符串与指针
我们可以用指针来定义字符串,这样能有效减少字符的占用:类型名 *数组名[数组长度]。
{
char names[4][20] = {
"WangDapao",
"ZhangSan",
"LiSi",
"LiuMazi",
}
{
char *names[] = {
"WangDapao",
"ZhangSan",
"LiSi",
"LiuMazi",
}
{
//前面加const,就意味着定义的数组之后是不可改变的。
const char *names[] = {
"WangDapao",
"ZhangSan",
"LiSi",
"LiuMazi",
}
第一个浪费了80个字符,而下面用指针定义的字符串更节省字符。
单独定义 const 变量相当于使用 #define 命令代替。 const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。
6.指向指针的指针
顾名思义,指向指针的指针就可以理解为你给一个软件快捷方式建立了一个快捷方式,也就是套娃。
#include <stdio.h>
int main ()
{
int V;
int *Pt1;
int **Pt2;
V = 100;
/* 获取 V 的地址 */
Pt1 = &V;
/* 使用运算符 & 获取 Pt1 的地址 */
Pt2 = &Pt1;
/* 使用 pptr 获取值 */
printf("var = %d\n", V );
printf("Pt1 = %p\n", Pt1 );
printf("*Pt1 = %d\n", *Pt1 );
printf("Pt2 = %p\n", Pt2 );
printf("**Pt2 = %d\n", **Pt2);
return 0;
}
如图就是输出结果,**Pt2即为*Pt1,实际上也就是V。这很好理解,就不赘述了。
二、指针变量作为函数参数
通常情况下,当我们使用没有返回值的函数时,是无法在主函数输出被函数处理过后的参数的,那么我们就需要用到指针变量作为函数参数!例如下面程序:
#include <stdio.h>
void swap(int* p1, int* p2);
void exchange(int* pt1, int* pt2, int* pt3);
int main(void)
{
int a, b, c, * q1, * q2, * q3;
printf("请输入你想排序的三个数:\n");
scanf_s("%d,%d,%d", &a, &b, &c);
q1 = &a;
q2 = &b;
q3 = &c;
exchange(q1, q2, q3);
printf("%d,%d,%d", a, b, c);
}
void swap(int* p1, int* p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void exchange(int* pt1, int* pt2, int* pt3) {
int temp = 0;
if (*pt1 < *pt2)
swap(pt1, pt2);
if (*pt1 < *pt3)
swap(pt1, pt3);
if (*pt2 < *pt3)
swap(pt2, pt3);
}
输入三个值,然后以指针的形式传递给exchange函数,然后再由exchange函数由指针的形式传递给swap函数,最后得到降序排列的三个整数。
到这里就结束了,祝大家中秋快乐(doge