C语言初阶 – 指针

一、指针是什么?

指针是什么?

指针理解的2个要点:

1、指针是内存中一个最小单元(内存单元)的编号,也就是地址

2、平时口语中说的指针,通常是指针变量,用来存放内存地址的变量

总结:指针就是地址,口语中说的指针通常指的是指针变量

那么我们就这样理解:内存

C语言初阶 - 指针
C语言初阶 - 指针

指针变量

我们可以通过&(取地址操作符)取出变量的内存地址,把地址可以存放到一个变量中,这个变量就是指针变量

int main()
{
	int a = 10; // a是整型变量,占用4个字节的内存空间
	int* p = &a; 

	return 0;
}

总结

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)

那这里的问题是:

  • 一个小的单元到底是多大?(1个字节)
  • 如何编址?
  • 经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电
(低电压)就是(1或者0);
那么32根地址线产生的地址就会是:

C语言初阶 - 指针

这里就有2的32次方个地址:

C语言初阶 - 指针

同样的方法,那64位机器,如果给64根地址线,那能编址多大空间,自己计算。

C语言初阶 - 指针

这里我们就明白:

  • 32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
  • 那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

总结:

  • 指针变量是用来存放地址的,地址是唯一标示一块地址空间的。
  • 指针的大小在32位平台是4个字节,在64位平台是8个字节
// #64位平台
char* pc = NULL;
short* ps = NULL;
int* pi = NULL;
double* pd = NULL;

// sizeof 返回的类型是无符号整型
printf("%zu\n", sizeof(pc));
printf("%zu\n", sizeof(ps));
printf("%zu\n", sizeof(pi));
printf("%zu\n", sizeof(pd)); //8

二、指针和指针类型

这里我们在讨论一下:指针的类型

我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?

准确的说:有的。

2.1 指针类型的第1个意义

当有这样的代码:

int a = 0x11223344;
char* pc = (char*)&a;
*pc = 0;
C语言初阶 - 指针

结论1

指针类型决定了指针在被解引用的时候访问几个字节

如果是 int 的指针,解引用访问4个字节

如果是 char 的指针,解引用访问1个字节

推广到其他类型等等

2.2 指针类型的第2个意义

C语言初阶 - 指针
C语言初阶 - 指针
int n = 10;
char* pc = (char*)&n;
int* pi = &n;

printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);

结论2:
指针的类型决定了指针+-1操作的时候,跳过几个字节//决定了指针的步长,也就是说指针的类型决定了指针向前或向后走一步有多大距离

比如char类型的指针+1,只跳过了一个字节

如果是int类型的指针,则跳过了4个字节

如果类型不匹配,强制类型转换即可

int *和 float *是不是就可以通用啊?

不能通用! int*float* 是完全不同的类型,不可以随意互换使用。

主要原因:

1. 指向的数据类型不同

  • int* 指向整数(通常4字节)
  • float* 指向浮点数(通常4字节)

2. 内存解释方式不同 虽然都可能占用4字节,但存储格式完全不同:

  • int: 二进制补码表示
  • float: IEEE 754浮点格式

3. 编译器类型检查

int a = 10;
float b = 3.14f;
int* p1 = &a;
float* p2 = &b;
p1 = p2; // 编译错误!类型不匹配

4. 强制转换的后果

int x = 1065353216;
float* fp = (float*)&x;
printf("%f\n", *fp); // 输出 1.000000(不是期望的整数值)

正确做法:

  • 使用 void* 作为通用指针
  • 需要时进行适当的类型转换
  • 或者使用联合体(union)处理同一内存的不同解释

所以 int*float* 绝对不能通用!

C语言初阶 - 指针

2.3 容易混淆的点

C语言初阶 - 指针

pa的空间大小与a的空间大小没有半毛钱关系

三、野指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

3.1 野指针成因

1、指针未初始化

int* p; 
// p没有初始化,就意味着没有明确的指向
// 一个局部变量不初始化,放的是随机值;0xcccccccc
*p = 10; 
  • p没有初始化,就意味着没有明确的指向
  • 一个局部变量不初始化,放的是随机值;0xcccccccc
  • 非法访问内存

2、指针越界访问

本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客

(0)
何大锤的头像何大锤管理团队

相关推荐

  • C语言初阶 – 操作符

    一、操作符分类 1、算术操作符 2、移位操作符 3、位操作符 4、赋值操作符 5、单目操作符 6、关系操作符 7、逻辑操作符 8、条件操作符 9、逗号操作符 10、下标引用、函数调用和结构成员 二、算术操作符 1、+ 2、- 3、* 4、/ 5、% 结论: 除了%操作符,其他的操作符可以作用于整数和浮点数 对于 / 操作符如果两个操作数都为整数,执行整数除法…

    2025年6月18日
    000
  • 初始C语言01

    0、什么是C语言? C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MC…

    2025年6月10日
    000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
网站建设中ing......