指针学习——初阶

本文解释了编程中如何定义和使用变量,包括内存分配的依据类型,以及如何通过指针操作内存。重点介绍了如何定义指向变量地址的指针,并强调了初始化指针和避免野指针的重要性,还提到了C语言中的NULL概念。
摘要由CSDN通过智能技术生成

        在编程中,当我们定义一个变量时,实际上是向计算机系统发送一个请求,请求系统为我们分配一块适当大小的内存,以存储相应类型的数据。这一过程可以通过变量的定义语句来实现。例如:

int a = 100;
char c = 'x';
double f = 1.2;

        对于这三个定义语句,系统会为我们分别在内存中分配三块内存,用于存储不同类型的数据。由于变量的类型不同,这三块内存的大小也不同。变量 `a` 是整型,所以系统为其分配4 bytes的内存以存储整数值;变量 `c` 是字符型,系统分配1 byte内存用于存储单个字符;变量 `f` 是双精度浮点型,因此系统为其分配8 bytes的内存以存储浮点数。

​        这样,我们可以通过变量名 `a`、`c` 和 `f` 来访问这些内存块,存储和操作相应的数据。变量的定义不仅告诉系统我们要使用这些数据,而且指定了数据的类型,系统据此分配适当大小的内存,确保数据的正确存储和处理。如下图所示:

        辣么,在程序中怎么定义一个可以用来存放变量 a 的地址的指针呢?噔噔噔……请看:

int  * p;// 

        在上面的定义的语句中,*告诉编译器p是一个指针,p存放了一个地址,而int则指明了p所存放的地址是int类型数据的地址。好了基本的就是这样,见代码,现在我们把a的地址给到p。那么,因为p指向的是a的地址,所以 *p又表示一个指针变量 `p` 所指向的内存中的值。这是通过使用指针解引用操作符 `*` 来实现的,所以现在 *p的值等于a的值。

#include <stdio.h>
int main(void)
{
	int   a = 100;
	int *p;
	p = &a; // 使指针 p 指向 a
    printf(" a: %d\n",   a);
    printf("*p: %d\n", *p);      // *p 等价于 a
    return 0;
}

结果如下:

​        总体而言,p = &a; printf("*p: %d\n", *p);展示了指针的基本操作。赋值时需要确保赋给指针的值是与指针类型相匹配的地址,否则编译器会发出警告。解引用则是通过 `*` 操作符来访问指针所指向的内存中的值。在这个例子中,`a` 和 `*p` 的值是一样的,因为 `*p` 表示指针 `p` 所指向的地址中的值,而这个地址正是变量 `a` 的地址。如同其他任何一种变量,我们可以在定义指针的时候同时给他一个初始值。

​        但是有些时候,我们无法在定义时立即给他一个有效地址,而是在程序执行到某一恰当时刻再给他复制。那么在这一段时间内他就会是一个随机值,如果在这时对他进行操作,程 序就会访问非法内存,导致本程序崩溃甚至更严重的后果,这样的未初始化的指针我们称之 为野指针。

一般而言,对于一个暂时使用不到的指针我们会将其初始化为空指针

int *p = NULL;//

那么NULL是什么?NULL实际上是一个宏定义#define NULL (void *)0,从值上看,NULL 就是地址 0x0000 0000。 在C语言中,将指针初始化为`NULL`是一种良好的编程实践。这是因为指针在被声明后,如果没有被明确初始化,它会包含一个不确定的值,可能是一个无效的内存地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

语文同步练习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值