初阶指针C语言(上)

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

1、指针是什么?


在写C语言程序的时候,创建的变量、数组都需要在内存上开辟空间。每个内存都

有唯一的编号,这个编号也称为地址编号,也就是地址,即指针 ;如下图

地址编号 = 地址 = 指针

这里我们需要明确两个要点:

       1、指针是内存中最小单元的编号,也就是地址,这上面我们已经解释过了

       2、平时口语说的指针,通常是指针变量,是用来存放内存地址的变量,这里做何解释呢?


1. int a = 0;
2. int* p = &a;
3. //&a取出a的地址


比如上述代码,p就是我们口语所说的指针,但其实它是一个指针变量,里面存放的是a的地址

其实看过博主前面的文章的宝子都知道,博主在前面讲过指针变量的大小为4个字节和8个字节。当时没有做出解释,其实这里就需要涉及到知道计算机当中是如何编址的?



那我们这里总共就有2^32个地址,每一个地址标识一个字节,那么就有4GB的空闲进行编址,计算如下



那么对于64位的机器来说,我们就会有2^64个地址,每个地址标识一个字节,而对于一般的计算机而言我们不会把64根线全用上,通常用8GB的空闲进行编程,计算如下


而我们的指针变量存放着我们的地址,所以我们就明白了


总结:

       1、地址就是指针,口语中的指针指的是指针变量

       2、在32位的机器上,指针变量的大小为4;在64为的机器上时,指针变量大小为8


2、指针和指针类型


指针的类型和定义方式

int * 存放int类型变量的指针
char * 存放char类型变量的指针
short * 存放short类型的变量
long * 存放long类型的变量
float * 存放float类型的变量
double * 存放double类型的变量
指针的定义方式 type + *

       2.1、指针+ - 整数


这里我们需要明确,指针就是地址,所以指针 + - 整数,其实就是对地址+ -;而指针类型决定着+/-1操作时所需要跳过的字节数;比如整形指针+1就跳过4个字节;char类型指针+1就跳过一个字节,应用如下:


如上图,pa为整型,pa+1后地址从00BBFA38-->00BBFA3C,跳了四个字节;pc为char类型,pc+1后地址从00BBFA38-->00BBFA39,跳了一个字节;博主这里只移动了一个字节,若移动n个,只需要用指针所在类型所占字节乘以n就行


       2.2、指针的解应用


type  *  p  //*说明p是指针变量
1.p指向的对象的类型

2.p解引用的时候访问的对象大小是sizeof(type) 


首先我们先看一段代码的运行结果



这里我们发现,我们用解引用操作符访问int型的pa时,这时候四个字节的数都变为了0;

那么这时候我们再看一段代码:


而这里,我们用解引用操作符访问char型的pa时,这个时候只有一个字节的数变为了0;a变为了0x11223300,这里需要注意0x11223344在存储时是倒着存储的,由于这里a为16进制数,一位16进制的数需要用4个2进制数表示,也就是4比特位,两位就是8比特位为一个字节,所以题中用解应用操作符访问char型的pa时,44都变为了0,就是因为44占用一个字节;

总结

       指针类型可以决定指针解引用的时候访问多少个字节(指针的权限)


3、野指针


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


       3.1、野指针成因


1、指针未初始化

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

2、指针越界访问

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

3、指针指向的空间释放

1. //int* test()
2. //{
3. // int a = 110;
4. // return &a;
5. //}
6. //
7. //int main()
8. //{
9. // int* p = test();
10. //  printf("%d\n", *p);
11. //
12. //  return 0;
13. //}


上述代码在调用test()函数时,这时候内存会为a变量开辟一块空房间,这时候&a会取出a的地址并返回,但是这时候由于test()函数的结束,a的空间还给操作系统了,那么这里指针p指向空间就会被释放,p就变成了野指针;


       3.2、如何规避野指针


1.指针初始化:明确知道指针初始化为谁的地址,就直接初始化;不知道指针初始化什么值,暂时初始化为NULL;

2.小心指针越界

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

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

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

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

热门文章

最新文章