指针基础入门

本文介绍了指针的基础知识,包括指针的定义、指针类型、野指针及其避免方法、指针-指针的概念、二级指针以及指针数组。通过学习,读者将深入理解C语言中指针的使用和管理。
摘要由CSDN通过智能技术生成

目录

1.指针是什么?

2.指针和指针类型

 3.野指针

3.1野指针的成因

3.2 如何规避野指针

4.指针-指针

 5.二级指针

 6.指针数组


1.指针是什么?

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

2.指针通常是指针变量,用来存放地址。

内存被划分为一个个小的内存单元,一个基本的内存单元的大小是1个字节。内存单元的编号又称为地址。

我们的计算机有32位平台也有64位平台。

32位-32根地址线-物理的电线-通电-1/0

0000000000000000000000000000000

0000000000000000000000000000001

0000000000000000000000000000010

...

111111111111111111111111111111111111

一共有2^32,每个地址管理一个字节,一共管理的大小是2^32byte/1024/1024/1024 = 4GB

同理可得,64位平台是8GB。

我们知道了32位平台有32个0/1组成的,也就是32个bit位也就是4Byte。所以算出的指针的大小是4/8的。(32位平台是4Byte,64位平台是8Byte)

2.指针和指针类型

 

看这个代码,int*类型的在*p后可以直接更改4Byte,然而,再来看看这个

 

 char类型的指针只能访问一个字节。指针类型决定了在解引用时一次能访问几个字节(指针的权限)。

这里可以看到,一个整形指针+1向后走4个字节,一个字符指针+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<=10; i++)
   {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *p = i;
         p++;
   }
    return 0;
}

3. 指针指向的空间释放

#include<stdio.h>
int* test()
{
	int a = 100;
	return &a;
}
int main()
{
	int* p = test();
	printf("%d", *p);
	
	return 0;
}

3.2 如何规避野指针

1. 指针初始化

2. 小心指针越界

3. 指针指向空间释放即使置NULL(放置NULL后,不能在进行赋值)

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

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

4.指针-指针

指针-指针的意思是两个地址之间元素的个数。

但是指针-指针的前提是:两个指针指向同一块空间。

 5.二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针 。

 6.指针数组

指针数组是指针还是数组? 答案:是数组。是存放指针的数组。

例如int* arr[5] = { &a,&b,&c };

可以通过arr找到a,b,c的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值