23位与64位区别/指针类型作用/野指针/指针运算/二级指针

简介: 23位与64位区别/指针类型作用/野指针/指针运算/二级指针

32位与64位


32位机器是指CPU为32位

CPU是负责:

(2)指令控制(指令位数为32位);

指针地址可存放32位,可以表示4G的寄存器地址

64位机器:

指针地址可存放64位,可以表示pow(2,32)*4G的地址


指针类型的作用:

指针的大小都是4byte(32位机器)

1.指针类型决定了再解引用的时候指针有多大的权限:

int main()
{
    int a=1;
    int* pa=&a;
    *pa=2;//此时pa指针让a的值也发生了改变,a=2;
}
{
    int a=1;
    char*pa=&a;
    *pa=2;//此时pa指针让a的值也改变了,但是a!=2;
    //因为指针pa的权限只能改变1byte;//类型不同的时候编译器也会报警告
}


2.决定了,指针向前或者向后走一步,走多大距离

如下面,int型加1,地址增加4;char型加1,地址增加1;


73ee2732ad7540468bc75f810c3fbdea.png


野指针

1.指针未初始化

1. void main()
2. {
3. int* p;
4.     *p=20;//此时指针p就是野指针
5. }


纠正方法:

1. void main()
2. {
3.     int* p=NULL;
4.     *p=20;
5. }


2.指针越界访问

void main()
{
    int arr[10]={0};
    int* p=arr;
    for(int i=0;i<=11;i++)
    {
        *(p++)=i;    
    }//当指针超出10的范围,i=11时就发生了越界
}

3.指针指向空间释放

int* test()
{
    int a=10;
    printf("%d\n",a);
    return &a;
}//当&a返回的时候,a销毁了,这时候&a指向的a空间就释放了
void main()
{
    int* p=test();//这时候p就是野指针
    *p=100;
}

野指针避免方法:

*p=NULL;

一般指针等于 NULL 的就是野指针,在敲代码过程中尽量避免使用野指针

1. if(q!=NULL)使用指针前检查有效性
2. {.....}


1.指针初始化

2.小心指针越界

3.指针指向空间释放及时置空(*p=NULL)

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

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


指针运算

1.指针+-整数

指针加减整数所得的结果要看指针类型,而不是字节个数;

2.指针-指针

得到指针和指针之间元素的个数


void main
{
    int arr[10]={0,1,2,3,4,5,6,7,8,9}
    printf("%d\n",arr[9]-arr[0]);//这时候打印的是9
}

3.指针的关系运算

两个指针可以比较大小


允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的那个内存位置的指针进项比较(允许向后越,不允许向前越界),大部分编译器都可以运行,但是与向前越界的比较不规范,不建议使用

void main()
{
    int arr[10]={0};
    for(int* p=&arr[0];p<&arr[9];)
    {
        *++p=0;//先++P,然后*p=0;    
    }//将arr[1]到arr[10]的值变成0;
}

数组与指针

数组名是首元素的地址

但是有两个例外:

1.sezeof(数组名),数组名表示整个数组,计算的是整个数组的大小

2.&数组名,数组名表示整个数组,取出的是整个数组的地址

整个数组指针与数组首元素地址不一样:

打印的一样但功能不一样,数组名的指针进行加减时候加减的是整个数组的大小(类型不一样);


d1e8209ae7b248dda476826926f99f40.png


数组可以通过指针访问

二级指针

void main()
{
    int a=10;
    int* pa=&a;//       (一级指针),pa是一个指针变量,同样需要四个字节的内存,这个内存也有一个地址
    int* * ppa=&pa;//   (二级指针)
    int* * *pppa=&ppa;//(三级指针)
}

d3942ec994294313a8003a6aa1f05ff5.png


指针数组

存放指针(地址)的数组就叫指针数组

void main()
{
    int =1,b=2,c=3,d=4;
    int* arr[4]={&a,&b,&c,&e};//指针数组
}

指针数组的具体用处(可以模拟二维数组):


abae5f56baf6413cac5151cdd974c729.png


c1be7e3a6e4848ff9bf4b3ff3307d049.png

相关文章
|
14天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
21天前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
21天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
27天前
|
人工智能
魔法指针 之 指针变量的意义 指针运算
魔法指针 之 指针变量的意义 指针运算
16 0
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
36 0
|
4月前
|
存储
头指针和头结点的区别
头指针和头结点的区别
126 1
|
5月前
|
编译器 C++
函数指针和函数对象不是同一类型怎么替换
函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数
|
5月前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
31 4