首页 > 其他分享 >C语言中指针解引用

C语言中指针解引用

时间:2024-10-03 16:47:10浏览次数:9  
标签:字节 int 元素 C语言 引用 跳过 指针

在32位的操作系统中,指针占据4个字节。在64位的操作系统中,指针占据8个字节。以下程序都是在32位操作系统中运行的。

1.指针解引用

程序运行结果为12345600

进入调试,可以看到变量a在内存占4个字节,a的地址为0x008FF794,在内存中的存储方式为小端存储方式。

当程序走完*p=0这一行时,把内存中的78改成00,只改变了内存中的一个字节,此时printf函数输出结果为12345600,为啥只改变一个字节呢?因为指针p的类型为char*类型,指针类型决定了指针解引用操作的时候,能够访问内存大小

比如:

int* p;  *p能够访问4个字节

char* p; *p能够访问1个字节

double*p; *p能够访问8个字节

上图,当把指针变量p的类型定义为int*类型的时候,程序输出结果为0。

上图,可以看到int*类型的指针变量,在解引用操作的时候,*p会访问4个字节,把这4个字节中的数据全部改为了0。所以类型不一样,你解引用操作就不一样。

接下来我们加大一点指针解引用的难度,首先我们了解下指针的步长是什么?

2.指针步长

指针步长:指针步长就是指针走一步走多远,步长的单位是字节。

int* p; p+1; 跳过了一个整形4个字节

char*p; p+1; 跳过了一个字符1个字节

double*p; p+1 跳过了一个双精度浮点型8个字节

3.指针解引用pro版本

运行结果为 0 0 0 0 5。

int*p=arr;这句意思就是把数组首元素1的地址给指针变量p。指针变量p的类型为int*类型,那么p+0跳过0个整形0个字节,此时的指针p指向数组元素1的地址,*(p+0)=0解引用把元素1改成0,p+1跳过一个整形4个字节,此时的指针p指向数组元素2的地址,*(p+1)=0解引用把元素2改成0,p+2跳过两个整形8个字节,此时的指针p指向数组元素3的地址,*(p+2)=0解引用把元素3改成0,p+3跳过三个整形12个字节,此时的指针p指向数组元素4的地址,*(p+3)=0解引用把元素4改成0。所以运行结果为0 0 0 0 5。

运行结果为0 0 3 4 5

因为arr强制转换为了short*类型的,32位系统下,short类型占2个字节,所以对p解引用只能访问2个字节,而int arr[]中每个元素是4个字节的,*(p+i)=0; 当i=0时,只是把1这个元素空间的一半变成0,i=1时,把1这个元素空间的另一半空间变成0,i=2时,把2这个元素空间的一半变成0,i=3时,把2这个元素空间的另一半空间变成0。所以运行结果为0 0 3 4 5。

综上,指针解引用你已经初窥门径。

标签:字节,int,元素,C语言,引用,跳过,指针
From: https://blog.csdn.net/2201_76137112/article/details/142692044

相关文章

  • C++之operator(附加返回引用的一些内容)
    在C++中,操作符重载允许你为自定义类型定义操作符的行为,使其可以像内置类型一样使用。通过定义operator函数,你可以指定操作符如何处理对象。基本语法ReturnTypeoperatorOp(Parameters){//实现}示例加法操作符重载#include<iostream>classPoint{public......
  • 65.【C语言】联合体
    目录目录1.定义2.格式3.例题答案速查分析4.练习答案速查分析5.相同成员的联合体和结构体的对比6.联合体的大小计算2条规则 答案速查分析练习答案速查分析7.联合体的优点8.匿名联合体1.定义和结构体有所不同,顾名思义:所有成员联合使用同一块内存空间,因......
  • C++函数指针详解
    概述本文详细介绍了C/C++中的普通函数和类的成员函数的指针。结合C++代码示例讲解了函数指针作为其他函数的输入、返回值以及typedef如何提高代码可读性的实用技巧。对于类的成员函数(方法)指针,则分为静态和非静态两种情况。最后总结了普通函数、类的非静态成员函数、类的静态成员......
  • C语言 函数指针
    概念在C语言中,函数指针是一种特殊的指针类型,它指向的是函数而不是普通的数据变量。函数在内存中有其入口地址,函数指针就是用来存储这个地址的变量。函数指针的定义函数指针的定义形式如下:返回值类型(*指针变量名)(参数类型列表);例如,定义一个指向返回值为int,参数为int......
  • C++指针等于地址加偏移量
    概述本文通过c++示例代码演示指针的加减法运算及对“指针=地址+偏移量”的理解。研究示例1.首先来检查各种变量类型所占的内存大小#include<iostream>usingnamespacestd;intmain(){ cout<<sizeof(char)<<endl;//1Byte cout<<sizeof(short)<<e......
  • 实验1 C语言输入输出和简单程序编写
    实验1:#include<stdio.h>intmain(){printf("0\n");printf("<H>\n");printf("II\n");return0;}  实验2:#include<stdio.h>intmain(){doublea,b,c;scanf("%l......
  • C语言顺序表 逐行解析!!!
    1、顺序表的概念及结构线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物......
  • 实验一 C语言开发环境使用和数据类型,运算符,表达式
    #include<stdio.h>intmain(){printf("0\n");printf("<H>\n");printf("II\n");printf("0\n");printf("<H>\n");printf("II\n");return0;......
  • C语言 共用体
    概念在C语言中,共用体(Union)是一种特殊的数据类型。它可以在不同的时刻存储不同类型的数据,但所有成员共享同一块内存空间。这与结构体不同,结构体的每个成员都有自己独立的内存空间。定义和声明定义共用体的定义形式与结构体相似,使用关键字union。例如:unionData{int......
  • C语言内存对齐
    概念在C语言中,内存对齐(MemoryAlignment)是一种编译器为了提高内存访问效率而采用的一种数据存储策略。它要求数据在内存中的存储地址是某个特定值(通常是数据类型大小或其倍数)的整数倍。为什么要进行内存对齐提高内存访问速度现代计算机的内存系统是以字节为单位进行组织......