前言
假设你是你们学校派来监督宿舍楼建造的监工,今天你去宿舍楼看了一圈,走到楼下门口,红框中的工人发现你的钥匙掉那个宿舍了,喊你过去,但是新造的宿舍楼还没装修,也没有标宿舍号,怎么办呢?你只能从第一层的第一个房间开始一个个往上找,这样的查找效率特别低,如果有宿舍号的话,那么查找会快很多。
一、指针是什么?
为了方便查找,我们给宿舍楼中的每间房标上了编号。同样为了方便查找,我们给内存中的每一个字节都带上了编号,用来提高查找效率,这里所谓的“编号“”,计算机中,我们称之为地址一般的地址,具有明显的指向性,我们一般把地址叫做指针。
指针就是地址。
二、指针和指针变量
1.指针
要了解指针,首先我们要知道一个概念:内存。内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址,而地址形象化地称为指针。
2.指针变量
变量都有地址(可以用&来取得变量的地址),那地址如何存储,就需要定义一个指针变量。指针变量是一个专门存放另一个变量的地址(即指针)的变量。指针变量的值是地址(即指针)。
3.指针变量的大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));
system("pause");
return 0;
}
32位:
64位: 结论:指针变量的大小在32位平台是4个字节,64位平台是8个字节。
4.指针VS指针变量
#include<stdio.h>
int main()
{
int a = 20, b = 10; //定义整型变量a,b,并初始化
int *p1, *p2; //定义指向整型数据的指针变量p1,p2,‘*’表示指向
p1 = &a; //把变量a的地址赋给指针变量p1
p2 = &b; //把变量b的地址赋给指针变量p2
printf("&a=%p &b=%p\n", &a, &b);//输出变量a,b的地址
printf("p1=%p p2=%p\n", p1, p2);//输出指针变量p1,p2
system("pause");
return 0;
}
通过这个例子可以让我们更好的理解指针变量,指针变量有变量名:p1,p2,有变量内容:&a,&b。
指针:是地址。
指针变量:要开辟空间,有变量名,有变量内容(指针变量中存放地址即指针)。
通常我们说的指针就是指针变量。
三、指针的使用
1.声明一个指针变量
代码如下:
int *p; // 声明一个 int 类型的指针 p
char *p // 声明一个 char 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针
2.指针的解引用
对指针的解引用,代表指针指向的目标。
代码如下:
#include <stdio.h>
int main()
{
int a = 20;
printf("a=%d\n", a);
printf("&a=%p\n", &a);
int *p = &a;
printf("p=%p\n", p);
printf("*p=%d\n", *p);//解引用
system("pause");
return 0;
}
使用指针的解引用,给a赋值10。
#include<stdio.h>
int main()
{
int a;
int *p = &a; //定义一个整型指针p,并且p指向了a的地址
*p = 10; //解引用,即给a赋值10;
printf("a=%d\n", a);
system("pause");
return 0;
}