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