首页 > 其他分享 >【重生之我】初学C语言之 指针

【重生之我】初学C语言之 指针

时间:2024-09-27 13:52:51浏览次数:8  
标签:字节 int pa C语言 地址 初学 内存 重生 指针

指针or地址???

指针概念

C语言中每个内存单元都有一个编号,有了这个内存单元的编号,CPU就可以快速找到一个内存空间,储存空间中一个字节里面能存放8个比特位。

bit

BYTE

KB

MB

GB

TB

比特

字节(8bit)

1024字节

1024KB

1024MB

1024GB

内存单元的编号==地址==指针

Cpu从内存单元中拿数据,Cpu算完后数据再储存在内存中。Cpu和内存之间由地址总线、数据总线、控制总线相连接。Cpu访问内存中的某个字节空间,需要知道这个字节再内存中什么位置,因为内存中字节有很多,所以需要给内存进行编址,计算机中的编址通过硬件设计完成的,并非把每个字节的地址记录下来。这里的内存指的是运行内存。

对于内存的管理:内存划分为一个一个小空间,每个小的空间称为内存单元,每个内存单元的大小是1个字节。

你可以理解为 CPU和内存之间有32/64根线(代表32/64位计算机)每根线能有俩中信息,0和1,在电流的作用下 32根线 有无电流即可表示为01100110110101110010......一根线两个含义,两根线4个含义

1.2取地址符&

int main()
    int a = 20;
    printf("%P",&a);
    int * pa = &a;
return 0;

 & 取地址操作符,拿到a的地址 

pa是一个变量,这个变量pa用来存放地址(指针)的,pa叫指针变量

int表示pa指向变量的类型

*表示pa是指针变量

每个字节都有地址 这里举个例子

在int 类型中 int a  ,a占用四个字节,每个字节都有自己的地址,那么使用取地址操作符会取四个字节的地址吗???

【重生之我】初学C语言之 指针_指针变量

编辑

通过实操我们看到了,实际上只有一个地址    取的是四个字节中 最小的那个地址,知道了最小的地址我们就能够推算出四个字节的地址了

1.3解引用操作符

我们只要拿到了指针,就可以通过指针找到指针的对象,这里通过解引用操作符(*)来实现

#include <stdio.h>
int main()
{
    int a =100;
    int *pa= &a;
    *pa = 0;
    return 0;
}

*pa的意思是通过pa存放的地址 找到指向空间,*pa就是a变量了

*pa = 0,这个操作符就是 把a改变成了0

pa 的类型 是int*

(这里把a修改交给了pa来操作,对a的修改就多了一种途径)

2.1指针变量的大小

32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。
如果指针变量是⽤来存放地址的,那么指针变的大小就得是4个字节的空间才可以。
同理64位机器,假设有64根地址线,⼀个地址就

是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的大小就是8个字节。

无具体类型指针

void*

兼容性指针,能够接受所有类型的指针,实现范性指针需求,但不能直接进行加减解引用,

2.2const操作修改指针变量

const具有常属性,不能被修改,本质上还是变量,

#include <stdio.h>
int main()
{
    int a =100;
    int *pa= &a;
    *pa = 0;
    return 0;
}

const的位置很重要 ,放在哪里很重要,对指针的限制不一样

int main()
{
int n = 100;
int m = 200;
int //位置一// * //位置二// p =&n;

*p=50;
p =&m;

return 0;
}

const放在*的右边限制的是指针变量本身,指针不能改变他的指向,但是可以通过指针变量修改他所指向的内容。

位置一  *p=50失效

位置二  p=&100失效

2.3指针 + - 整数操作

指针类型决定了指针+1的步长,决定了指针解引用的权限

数组在内存中是连续存放的

例如 int char 两个不同的类型,不同的类型指针跳跃是不一样的

2.4指针 - 指针

指针-指针是指针之间元素的个数,计算的前提条件是两个指针指向同一块空间 

strlen统计的字符串长度是\n之前的

数组名和首元素的地址是一致的

计算指针元素的个数有两种方法

1.使用count函数进行计算 2.首位指针相减即元素个数

2.5指针的关系运算

地址有大小之分,进行大小的比较

int main()
{
    int arr[10]= {1,2,3,4,5,6,7,8,9,10];

return 0;
}

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz)
	{
		printf("%d", *p);
		p++;
	}
	return 0;
}

2.6野指针

野指针

一个局部将变量不初始化,它的值是随机的

这里举个例子,让大家认识一下野指针

int main()
{
int a =100;
int *p= &a;
printf("%d",p);
return 0;
}
//上述过程中是正常的指针定义和使用,下面展示野指针//

int main()
{
int*p;
printf("%p\n,p);
return 0;
}


编程之路漫漫,行则将至


标签:字节,int,pa,C语言,地址,初学,内存,重生,指针
From: https://blog.51cto.com/u_17042469/12128092

相关文章

  • C语言入门到精通(第六版)——第七章
    7.1、循环语句    C语言中程序可以通过判断、检验条件做出选择,帮我们解决很多问题,除此之外,程序还可以执行重复,直到满足条件为止,例如,while、do...while和for语句。7.2、while语句    使用while语句可以解决某个条件满足时需要反复执行某个循环体的问题,表达式......
  • C语言中的一维数组
    引言一维数组是C语言中用于存储多个相同类型数据的基本数据结构。本文将详细介绍一维数组的定义、初始化、元素操作、作为参数传递的方式,以及实际应用示例。1.一维数组的定义1.1定义方式一维数组是由一系列相同类型的数据元素构成的线性集合。定义一维数组的基本语法......
  • 初学Java基础Day07---while循环,do-while循环,特殊流程孔子语句,Java循环习题
    一,while循环1.语法结构:while(表达式){....代码块/循环体.....}2.理解:        表达式的结果必须是boolean类型,true---执行代码块,false--跳出循环体3.案例//案例:用while循环,打印五遍HelloWorldinti=1;while(i<=5){System.out.println("HelloWorld");......
  • 揭秘合并排序:分治排序初学者指南
    归并排序由约翰·冯·诺依曼于1945年提出,主要是为了提高大型数据集的排序效率。冯·诺依曼的算法旨在使用分而治之的方法提供一致且可预测的排序过程。这种策略允许归并排序有效地处理小型和大型数据集,保证在所有情况下都能实现稳定的排序,时间复杂度为o(nlogn)。合并排序采用......
  • C语言(各种字符函数的使用)
     目录字符分类函数islower函数isupper函数字符转换函数strlen函数的使用和模拟实现strlen模拟实现计数器⽅式strlen模拟实现不能创建临时变量计数器strlen指针-指针的⽅式stcpy的使用和模拟实现stcpy模拟实现strcat的使用和模拟实现strcat模拟实现strcmp的使用和......
  • c语言中对字符串进行左旋的三种方法
    例如:对 a  b  c  d            b  c  d  a左旋第一次              c  d  a  b左旋第二次                 d  a  b  c左旋第......
  • 掌握 JavaScript:初学者的基本技巧
    JavaScript是一种多功能且功能强大的编程语言,构成了现代Web开发的支柱。如果您是JavaScript新手,这里有一些基本技巧可帮助您掌握其概念并开始构建交互式Web应用程序:1.了解基础知识:变量和数据类型:了解变量、它们的类型(数字、字符串、布尔值、对象、数组等)以及如何操......
  • c语言--结构体
    一结构体详解1.1结构体类型声明1 structtag2 {3 member-list;4 }variable-list;struct是结构体关键字 tag是结构体的标签名,是自定义的 structtag就是结构体类型 {}里面放的是成员列表 variable-list是变量 member-lis......
  • c语言--文件操作
    一为什么使用文件?如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。二什么是文件磁盘(硬盘)上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的......
  • c语言中fork,exec和system函数的理解
    fork用于创建子进程。由fork创建的新进程被称为子进程(childprocess)。fork函数被调用一次,但返回两次。在父进程中,fork返回新创建子进程的进程ID。在子进程中,fork返回0。如果出现错误,fork返回一个负值。包含在<unistd.h>中,是Unix系统特有的文件(Macos并不太清楚),因此需要......