当前位置 : 主页 > 编程语言 > c语言 >

C语言 — 指针基础篇(1)

来源:互联网 收集:自由互联 发布时间:2023-08-25
前言 对C语言指针基础的回顾 本文对指针、野指针、指针类型的内容进行介绍 在指针基础篇(2)中进行对指针运算、指针和数组、二级指针、指针数组进行介绍 如果有帮助,还请各位


前言

对C语言指针基础的回顾
本文对指针、野指针、指针类型的内容进行介绍
在指针基础篇(2)中进行对指针运算、指针和数组、二级指针、指针数组进行介绍
如果有帮助,还请各位小伙伴多多点赞关注收藏,后期会持续进行更新!!!



文章目录

  • 前言
  • 一、什么是指针
  • 1.指针变量
  • 2.指针的大小
  • 二、指针类型
  • 1.指针变量类型
  • 2.指针类型的意义
  • 指针类型间的差别
  • 指针的解引用
  • 三、野指针
  • 1.什么是野指针
  • 2.野指针成因
  • 3.如何避免野指针
  • 四、总结


一、什么是指针

简单来说,指针就是地址是内存中一个最小单元的编号
用来存放内存地址的变量通常被称为指针,即为指针变量

1.指针变量

用来存放地址的变量,叫做指针变量,在这个变量中存放的是地址

下面用代码举个例子

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	printf("%p", pa);
	return 0;
}

输出结果

C语言 — 指针基础篇(1)_野指针


这里的pa指针变量是用来存放a的地址

指针就是内存

2.指针的大小

在内存中指针的大小在不同的机器中是不同的

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

指针的大小在 32 位平台是 4 个字节,在 64 位平台是 8 个字节

二、指针类型

1.指针变量类型

变量有不同的类型,指针变量也有
指针类型可以分为以下几类:

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

同理得
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。

2.指针类型的意义

为什么会有这么多类型? 不同类型指针的大小有没有区别?

指针类型间的差别

用代码举个例子

#include <stdio.h>
int main()
{
	int a = 10;
	char* pc = (char*)&a;
	int* pi = &a;

	printf("%p\n", &a);
	printf("%p\n", pc);
	printf("%p\n", pc + 1);
	printf("%p\n", pi);
	printf("%p\n", pi + 1);
	return 0;
}

输出结果

C语言 — 指针基础篇(1)_c++_02


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

指针的解引用

演示代码

#include <stdio.h>
int main()
{
	int n = 0x11223344;
	char* pc = (char*)&n;
	int* pi = &n;
	*pc = 0; 
	*pi = 0; 
	return 0;
}

输出结果

C语言 — 指针基础篇(1)_指针变量_03


指针的类型决定指针解引用的时候能操作几个字节

如 char* 的指针解引用就只能访问一个字节, int* 的指针的解引用就能访问四个字节。

三、野指针

1.什么是野指针

在C语言中,野指针是指指向未知或无效内存地址的指针。当指针指向的内存地址没有被初始化或者已被释放时,这个指针就是野指针。野指针可能会导致程序崩溃、出现不可预期的结果或者安全漏洞。因此,在使用指针时需要避免野指针的出现。

2.野指针成因

野指针成因分为以下三类:
1.指针在使用前未初始化

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

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.指针指向的空间释放
这里是基础篇的介绍,会放到指针进阶篇中进行介绍

3.如何避免野指针

野指针的出现主要是因为程序员使用未初始化的指针、已经被释放的指针或者指针越界等错误操作所造成的

为了避免野指针的出现,可以采取以下措施:

  1. 初始化指针变量。指针变量在定义时应该进行初始化,防止指针变量不确定性。
  2. 使用NULL指针。当指针没有指向任何变量时,应该将指针赋值为NULL,防止野指针出现。
  3. 尽量使用动态内存分配。使用动态内存分配函数(如 malloc、calloc 等)时,要注意分配的内存大小,以及使用后释放内存。
  4. 避免指针越界。指针越界会破坏内存结构,导致野指针的出现。要保证指针在有效的内存范围内操作。
  5. 及时释放指针。在指针不再使用时,及时释放指针,避免野指针的出现。
  6. 使用静态分析工具进行代码检查,检查指针是否未初始化或者使用后未释放。

四、总结

本篇对指针、指针类型和野指针进行了介绍,在C语言使用指针时要避免野指针的出现。
文章重点内容:

  1. 指针的大小在 32 位平台是 4 个字节,在 64 位平台是 8 个字节
  2. 指针的类型决定了指针向前或者向后走一步有多大(距离)
  3. 指针的类型决定指针解引用的时候能操作几个字节
  4. 使用未初始化的指针、已经被释放的指针或者指针越界会造成野指针

如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。


上一篇:Visual Studio 2019 解决scanf函数报错问题
下一篇:没有了
网友评论