zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言指针类型的意义

C语言 类型 指针 意义
2023-09-27 14:28:31 时间

 

c3feaff094534304878603533bae696f.jpg

▶️文章目录

1.指针的概念

2.指针和指针类型

3.野指针

3.1野指针成因

3.2如何规避野指针


 

 

1.指针的概念

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

指针理解的2个要点:

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

2. 平时口语中说的指针,通常指的是指指针变量

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

这个变量就是指针变量,是用来存放内存地址的变量

#include <stdio.h>
int main()
{ 
    int a=10;//在内存中开辟一块空间 
    int*p=&a;//这里我们对变量a,取出它的地址,可以使用&操作符。   
             //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个指针变量。 
    return 0;
}

指针变量的大小:

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

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000001

...

11111111 11111111 11111111 11111111

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

每个地址标识一个字节,那我们就可以给(2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB)4G的空闲进行编址

 

总结:

指针是用来存放地址的,地址是唯一标示一块地址空间的

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

指针的大小是4或8字节,但是通过指针找到的数据的大小是由指针类型决定的

 

2.指针和指针类型

指针类型的第一个意义:

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

int*指针,解引用访问4个字节

char*指针,解引用访问1个字节

可以推广到其它类型

 

int*指针解引用的访问情况:

 

c3aec09f9dc84dbaa1ce2800882d020f.png

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

 

char*指针解引用的访问情况:

 

7391ae9dc4714bd88104e9d7a7da5586.png

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

 

 

指针类型的第二个意义:

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	char* pc = (char*)&a;
	
	printf("%d\n", pa);
	printf("%d\n", pa+1);
	printf("%d\n", pc);
	printf("%d\n", pc+1);

	return 0;
}



 

1a76ba1235e2474687e22b160f3ca02f.png

int*指针+1向后走4个字节

char*指针+1向后走1个字节

 

3.野指针

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

3.1野指针成因

1. 指针未初始化

#include <stdio.h>
int main()
{  
    int*p;//局部变量指针未初始化,默认为随机值    
    *p=20; 
    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.2如何规避野指针

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放即使置NULL,0地址是无法访问的

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

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

 

 

祝大家520快乐!!!