【C语言】指针----初阶(上)

简介: 【C语言】指针----初阶(上)

🍁 博客主页:江池俊的博客

🍁收录专栏:C语言——探索高效编程的基石

🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞


098fa8c5dc364d7fad0bcb6961c239a1.png


一、指针是什么?



在计算机科学中,指针是一种变量类型,它存储了一个内存地址。这个内存地址指向计算机内存中的一个特定位置,该位置存储了实际的数据。通过使用指针,可以直接访问和修改存储在特定内存位置的数据,而无需复制或移动数据本身。(本质上指针就是地址)


1.1指针与内存间的关系


ee911cde41074f0e9c764abf3b0aef8c.png


这里我们知道char类型占1个字节的内存空间,short类型占2个字节的内存空间,int类型占4个字节的内存空间,long类型占4个字节的内存空间,long long类型占8个字节的内存空间,float类型占4个字节的内存空间,double类型占8个字节的内存空间。


内存

2d8f1e80b66844058caf9cd858c57387.jpg


经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。

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

那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

........

01111111 11111111 11111111 11111111

10000000 00000000 00000000 00000000

10000000 00000000 00000000 00000001

........

11111111 11111111 11111111 11111110

11111111 11111111 11111111 11111111

一共有种可能的编号,每一种编号表示一个内存单元的地址,所以共有个地址。每个地址表示一个字节,那我们就可以给

(2^32Byte=2^32/1024KB=2^32/1024/1024MB=2^32/1024/1024/1024GB = 4GB)4G的空闲进行编址。

同样的方法,那64位机器,如果给64根地址线,那么就有个地址。


这里我们就明白:

🌴 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储(因为一个字节等于八个比特位,而一个0或1占一个比特位),所以一个指针变量的大小就应该是4个字节。

🌴同理,那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。


1.2指针变量存放地址


4406b659685f44d9b005c6f822ed8dec.png


注意:这里a的值以16进制的形式存储在内存中的并且是倒着存放的(这里涉及到大小端问题) 。

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


二、指针和指针类型



2.1指针有哪些类型?

char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;


不同类型的指针其实是为了存放对应类型变量的地址。


2.2指针类型的意义是什么?


2.2.1指针的类型决定了指针向前或者向后走一步有多大(距离)。


c87645e2f03b49468f340842580e2cbd.png


这里我们不难看出,char*类型的指针加一时,它的地址增加了1个字节,而int*类型的指针加一时,它的地址增加了4个字节 。


总结:指针变量加减 ,跳过多少字节(地址加减多少)取决于指针类型

例如:

如果是 char 类型指针,指针变量加 1或减1 实际上地址加了或减了 1 个字节

如果是 short 类型指针,指针变量加 1或减1  实际上地址加了或减了 2 个字节

如果是 int 类型指针,指针变量加 1或减1  实际上地址加了或减了 4 个字节


2.2.2 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。


📌char*指针

139ba8e9a6e042c982e51018154e4104.png


这里是将int类型的变量n的地址强制转换赋给了char类型指针pc

0678eadb014e4f83acf0960daf1b89b4.png

指针pc解引用后:


📌int*指针

1e8c8aee465142389b0ba34912999ee2.png

f6979d25f4754ebdafc34633d8bb2ef3.png

指针pi解引用后:


三、野指针



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


3.1野指针成因


3.1.1. 指针未初始化

#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}


3.1.2. 指针越界访问


#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}


3.1.3. 指针指向的空间释放


动态开辟一块空间时返回的值存放到一个指针中,当使用完这个指针后没有释放时,该指针就会变为野指针。


3.2 如何规避野指针


1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放即使置NULL

4. 避免返回局部变量的地址

5. 指针使用之前检查有效性

#include <stdio.h>
int main()
{
int *p = NULL;
int a = 10;
p = &a;
//检查指针的有效性
if(p != NULL)
{
*p = 20;
}
return 0;
}



目录
相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
52 0
|
10天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
58 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
10天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
34 9
|
10天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
32 7
|
20天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
13天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
13天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
43 3
|
14天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
20天前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
42 10
|
13天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
29 1