指针详细解析(1)

本文详细解释了计算机内存的工作原理,包括内存单元的结构、编址机制以及如何通过地址总线传输数据。同时介绍了指针变量的概念,如获取变量地址、不同类型指针的作用以及指针与整数和指针之间的运算含义。
摘要由CSDN通过智能技术生成

1.内存和地址

1.1内存

计算机是通过cpu来进行高速运算的,而cpu运算的内容是在内存中读取的。如今,市场上常见的内存大小由8GB/16GB/32GB,那么,内存中的数据是如何进行储存的呢?

事实则是把内存划为一个一个单独的内存单元,一个内存单元的大小是一个字节(8byte)。

而内存也被叫为指针,即 内存 == 指针

1.2编址的简单理解

CPU要在内存中提取内容,那么储存在内存中的内容如何传输到CPU上呢? 内存空间很大,要如何快速在庞大的内存空间中找到需要的内容呢? 这时候就需要编址。 给每一个内存单元给上一个地址,就好比给一栋宿舍楼里的房间给上各自的房间号一样,此时,只需要读取这个内存单元的编址就可以快速找到所需要的内容。

那么CPU是如何知道这个地址的呢? 计算机中有相当多的硬件,这些硬件之间是相互独立的,这时通过数据线将他们串通起来。 CPU和内存之间存在着地址总线,数据总线和控制总线,这里只需要关注地址总线。

平时我们常听到的32位和64位机器,就可以简单理解为地址总线的数量,32位就是32根地址线,64位即64位地址线,每条线通过脉冲信号传输0、1,那么有n根地址线,就有2^n个地址。此时,cpu就可以知道所需内容的地址,然后快速在那种中提取。

2.指针变量和地址

2.1获取变量地址和使用指针变量

在编写程序中,有时我们需要通过地址来对变量进行修改等其它操作,我们如何在程序中提取变量的地址呢。

int main()
{
int a = 1; //int型变量a
int *p = &a;  // int*型的指针变量p
return 0;
}

这里有一个整型变量a,还有一个变量p,不同的是它的类型是int* ,这就是指针变量。 * 代表指针,而*前面的代表所要提取地址的变量的类型, 然后再 = 后取(&)a的地址即可。

那么此时我们获取到了a的地址,我们需要用到a的时候就可以通过p来找到a,并且可以通过p来修改a。

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

可以发现我们是可以直接通过地址来获取或者修改变量a的,那么我们为什么不直接通过a来修改,还需要通过地址这么一个二级步骤来操作呢?

这里我给出一个程序

void Switch (int a, int b)
{
	a = a + b;
	b = a - b;
	a = a - b; 
}
int main()
{
	int a = 1;    
	int b = 2;
	Switch (a, b); //交换两数的函数
	printf("a = %d  b= %d\n", a, b); a = 1 b = 2
	return 0;
}

是可以发现这里的交换数字函数并没有起到作用,原因是在主函数创建的a、b变量是实参,而传到函数中的a、b为形参,形参只是临时创建的变量,并不能实际影响到实参。

void Switch (int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}
int main()
{
	int a = 1;    
	int b = 2;
	Switch (&a, &b); //交换两数的函数
	printf("a = %d  b= %d\n", a, b);  // a = 2 b = 1
	return 0;
}

但是通过传输地址,我们通过指针变量来对a、b进行改变,发现是可以的。原因是每个变量的地址是创建好就确定下来的,变量a的地址就是它的地址,不会改变,那么我们把a的地址传输过去并找到a里面存的数字对它进行修改,则可以完成操作。

2.2指针的大小

上文说到,CPU和内存传输地址的方式是通过地址总线,而地址线里又区分为32位和64位,每一位即1byte位,所以32位和64位的地址分别位4字节和8字节。指针变量的大小仅跟运行系统位数相关,不与地址指向对象的类型相关。

2.3为何有不同的指针变量类型

指针变量的大小是通过操作为决定的,那么为什么还要有不同类型的指针变量呢?

2.3.1指针变量+-整数

char* short* int* long* float* double*

这些指针变量类型,虽然大小相同,但是在实现某些功能时并不相同。

我们知道的是,*前的类型的大小各不相同,当一个指针变量取加上一个整数的时候,代表着什么呢?

int main()
{
	int a = 1;
	int* p = &a;
	printf("%p\n", p);
	p += 1;
	printf("%p\n", p);
	return 0;
}

可以发现,地址差了4,刚好是一个整型的大小。所以指针变量类型可以决定这个指针变量每次向前前进多少距离。

2.4指针-指针

当两个指针变量相减时,得到的结果代表着什么呢?

int main()
{
	int arr[20] = { 1,2,3,4,5,6 };
	int* s = arr;
	printf("%d", (s + 4) - s);
	return 0;
}

可以看出两个指针相减代表的时两指针间相间隔的距离,单位是sizeof(int)。

3.感谢查阅

指针第一部分就到此结束,后续还会继续更新wuwuwuwu

  • 54
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值