C-指针和变量的内存表示形式
在本教程中,我们将学习C语言中内存中的指针和变量表示。
在上一教程"指针和变量"中,我们学习了通过指针操作变量。
现在,让我们谈谈变量和指针的内存表示形式。
创建变量
在本教程中,我们将考虑以下四个数据类型变量,分别为char,int,float和double。
数据类型 | 变量 | 内存大小 |
---|---|---|
char | char ch ='a'; | 1个字节 |
int | int i = 10; | 2字节 |
float | float f = 12.34; | 4字节 |
double | double d = 12.3456; | 8字节 |
我们可以将上述变量表示如下。
注意点!
在上图中,变量的值以二进制形式存储,即0和1(图中未显示)。
内存地址为十进制形式。
我们还可以使用0x03E8之类的十六进制形式表示1000。每个内存块的大小为1个字节。
为了简单起见,我们将起始地址设为1000、2000、3000和4000。
因此," char ch ='a';"变量获取内存地址1000,其大小为1个字节。
int i = 10;
变量获取地址2000和2001,因为它是2个字节。
float f = 12.34;
变量获得4字节的地址3000到3003。
double d = 12.3456;由于它是8个字节,因此变量获取地址4000到4007。
指针变量的大小
指针变量存储其他变量的地址。
这些地址是整数值。
我们可以使用sizeof()
运算符来查找指针变量的大小。
指针变量的大小取决于编译器。
例如,Borland C/C ++编译器需要2个字节来保存整数值,因此指针大小将为2个字节。
而Visual C ++编译器需要4个字节来保存整数值,因此,在这种情况下,指针的大小将为4个字节。
变量的指针
我们将为四个变量创建四个指针变量。
char *chPtr = &ch; int *iPtr = &i; float *fPtr = &f; double *dPtr = &d;
我们可以将上述指针变量表示如下。
在上图中,我们假设一个整数值占用2个字节。
因此,指针变量的大小为2个字节。
因此,指针变量" char * chPtr =&ch;"获得地址8000和8001。
我们仅显示起始地址8000。
存储在这些存储位置中的值是字符变量" ch"的起始位置1000。
指针变量" int * iPtr =&i;"获得地址8002和8003。
我们仅显示起始地址8002。
存储在这些存储器位置中的值是整数变量" i"的起始位置2000。
指针变量" float * fPtr =&f;"获得地址8004和8005。
我们仅显示起始地址8004。
存储在这些存储单元中的值是浮点变量" f"的起始位置3000。
指针变量double * dPtr =&d;获得地址8006和8007。
我们仅显示起始地址8006。
存储在这些存储单元中的值是double变量d的起始位置4000。
完整的代码
#include <stdio.h> int main(void) { //variables char ch = 'a'; int i = 10; float f = 12.34; double d = 12.3456; //pointers char *chPtr = &ch; int *iPtr = &i; float *fPtr = &f; double *dPtr = &d; //print value printf("ch: %c\n", *chPtr); printf("i: %d\n", *iPtr); printf("f: %f\n", *fPtr); printf("d: %lf\n", *dPtr); //print address printf("\n"); printf("Address ch: %ld\tsizeof ch: %ld\n", &ch, sizeof(ch)); printf("Address i: %ld\tsizeof i: %ld\n", &i, sizeof(i)); printf("Address f: %ld\tsizeof f: %ld\n", &f, sizeof(f)); printf("Address d: %ld\tsizeof d: %ld\n", &d, sizeof(d)); printf("\n"); printf("Address chPtr: %ld\tsizeof chPtr: %ld\n", &ch, sizeof(chPtr)); printf("Address iPtr: %ld\tsizeof iPtr: %ld\n", &i, sizeof(iPtr)); printf("Address fPtr: %ld\tsizeof fPtr: %ld\n", &f, sizeof(fPtr)); printf("Address dPtr: %ld\tsizeof dPtr: %ld\n", &d, sizeof(dPtr)); return 0; }
ch: a i: 10 f: 12.340000 d: 12.345600 Address ch: 140732808304699 sizeof ch: 1 Address i: 140732808304692 sizeof i: 4 Address f: 140732808304688 sizeof f: 4 Address d: 140732808304680 sizeof d: 8 Address chPtr: 140732808304699 sizeof chPtr: 8 Address iPtr: 140732808304692 sizeof iPtr: 8 Address fPtr: 140732808304688 sizeof fPtr: 8 Address dPtr: 140732808304680 sizeof dPtr: 8
注意!在上面的输出中,我们可以看到数据类型和指针变量的大小。
我使用的编译器使用8个字节存储指针变量的整数值。
数据类型和指针的地址和大小将根据所使用的编译器而有所不同。