【C语言入门】指针
文章目录
十五、指针
1 数据在电脑中的存储
电脑上产生的数据可以存放到哪里?
存储位置 | 存储大小 |
---|---|
寄存器 | 几个字节 |
缓存 | 几十MB |
内存 | 8G/16G/32G |
硬盘 | 50G/1T |
网盘 | 2T |
说明:上述表格,从下到上,存储空间变小、读取速度变快、实际造价变高。
2 内存分区(大致)
内存区域 | 使用形式 | 使用者 |
---|---|---|
栈区 | 进入作用域创建,出作用域即被销毁 | 局部变量、形式参数等临时作用的变量 |
堆区 | 动态内存分配 | malloc / calloc / realloc / free |
静态区 | 程序运行前创建,直到程序结束后才被销毁 | 全局变量、静态变量 |
3 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
3.1 内存单元
内存单元:为了能有效且合理地使用内存,就把内存划分为一个个小的内存单元,每个内存单元的大小是1个字节。
地址编号:为了能够有效地访问到(找到)内存中的每个内存单元,就对每个内存单元进行编号,这些编号就被称为该内存单元的地址编号。
3.2 内存的分配
变量是创建在内存中的(在内存中分配空间),每个内存单元都有地址,变量也是有地址的,通过对变量取地址能够找到这段内存空间。
代码示例:
#include<stdio.h>
int main()
{
int num = 10;
#//取出num变量的地址
printf("&num = %p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
解释说明:
1 int num = 10;
变量的创建就是向内存申请空间。此句代码表示向内存申请4个字节的内存空间,存放10这个值。
2 #
意思是取出变量 num
的地址, int
型变量 num
占用四个字节大小的空间,而一个地址对应一个内存空间(1字节大小)。
所以取出的是第一个字节的地址,也就是地址较小的那个内存空间的地址。
3 %p
:转换说明,此处用来打印地址。(以十六进制的形式打印地址)
图示说明:
4 指针变量
指针变量用来存放地址。不同类型的地址,需要对应类型的指针变量来存储。
4.1 示例
#include<stdio.h>
int main()
{
//指针变量
int num = 20;
int* p = #
*p = 100;//*p相当于num
printf("%d\n", num);//100
return 0;
}
解释说明:
1 int* p = #
创建一个指针变量 p
,存放变量 num
的地址。也可以说是指针 p
指向了整型变量 num
。
2 *p = 100;
对指针变量进行解引用,*p
可以看做是是 num
的一个别名。相当于:num = 100;
。
图示说明:
4.2 其他类型的指针变量
代码示例:
#include<stdio.h>
int main()
{
//字符型指针变量
char ch = 'a';
char* pc = &ch;
*pc = 'q';
printf("%c\n", ch);//q
return 0;
}
解释说明:
1 指向字符型变量的指针变量称为字符指针。
4.3 指针变量的大小
指针变量的大小取决于地址的大小。
4.3.1 地址线
地址线是用来传输地址信息的。
一根地址线确定一个存储单元,所有地址线上的可能取值的所有组合确定了存储单元的个数。
一根地址线有高低电平的电信号,转换成数字信号就是 0/1
。
32位机器上就有32根地址线,那么能确定 2^32
个地址,就能对应 2^32
的内存单元,也就可以访问 2^32 个字节的内存空间,即4GB。
64位机器上就有64根地址线,那么能确定 2^64
个地址,就能对应 2^64
的内存单元,也就可以访问 2^64 个字节的内存空间,即8GB。
4.3.2 指针变量的大小
计算指针变量的大小就是计算指针变量所占内存空间的大小。
代码示例:
include<stdio.h>
int main()
{
//指针变量的大小
//X86/X64 -- 32/64
printf("%d\n", sizeof(char*)); //4/8
printf("%d\n", sizeof(short*)); //4/8
printf("%d\n", sizeof(int*)); //4/8
printf("%d\n", sizeof(double*));//4/8
return 0;
}
解释说明:
1 32位平台下地址占用32个bit位(即4个字节)。
2 64位平台下地址占用64个bit位(即8个字节)。
4.3.3 结论
指针变量的大小在32位平台是4个字节,在64位平台是8个字节。
总结:
本节简单介绍了内存与内存分区;简单说明了什么是指针变量;最后给出了不同平台下的指针变量的大小。
感谢您的阅读!如有任何错误,欢迎您的批评指正!