概要:此文为指针基础篇,进阶篇参考底部。
目录
一、啥是🐽指针?
说鬼话😒——指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var_name; (type:类型;*:定义指针;:var_name:指针变量的名称)
说人话😍——你去住酒店,前台拿出一张房卡,把卡放到机器上,然后给房卡绑定一个房间号606,然后你拿着房卡去开606的门。 (房卡 = 指针变量;房间号 = 内存地址) 【把房卡与房间号邦定,就是让指针指向一个内存地址;房卡 -> 房间;指针 -> 内存地址】
二、让我们来看看有啥房型呢,🤡哦不,是有啥类型
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
这要注意一点:
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
三、怎么使用指针呢?
#include <stdio.h>
int main ()
{
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
ip = &var; /* 在指针变量中存储 var 的地址 */
printf("var 变量的地址: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("ip 变量存储的地址: %p\n", ip );
/* 使用指针访问值 */
printf("*ip 变量的值: %d\n", *ip );
return 0;
}
//以上代码的运行结果
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20
补充:
%c | 打印字符 |
%d | 打印有符号十进制整数 |
%f | 打印浮点数(包括float和double) |
%u | 打印无符号十进制整数 |
%o | 以八进制整数形式打印 |
%x | 以十六进制整数形式打印 |
%p | 打印地址 |
%s | 打印字符串 |
四、C 中的 NULL 指针
声明指针变量的时候,要是没有确切的地址给他,那么不妨给他一个NULL,这是一个好习惯。
#include <stdio.h>
int main ()
{
int *ptr = NULL;
printf("ptr 的地址是 %p\n", ptr );
return 0;
}
//结果:ptr 的地址是 0x0
五、指针的算术运算
C 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。
- 指针的每一次递增,它其实会指向下一个元素的存储单元。
- 指针的每一次递减,它都会指向前一个元素的存储单元。
- 指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。
举一个简单的例子:一个int指针p,指向地址1000,执行了p++,就变成了1004,指向了下一个整数开头的位置,移动了四个字节。
【注意】刚开始的 int *p;是声明一个指针变量p,在此之后,*p:就表示取该地址的值。p:就表示他指向的内存地址。
(说明)指针的比较:如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。
六、指针数组
声明一个指针数组: int *ptr[MAX]; (MAX:数组里有MAX个整数指针)
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
for ( i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, *ptr[i] );
}
return 0;
}
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200