C-指针和变量的内存表示形式

时间:2020-02-23 14:31:59  来源:igfitidea点击:

在本教程中,我们将学习C语言中内存中的指针和变量表示。

在上一教程"指针和变量"中,我们学习了通过指针操作变量。
现在,让我们谈谈变量和指针的内存表示形式。

创建变量

在本教程中,我们将考虑以下四个数据类型变量,分别为char,int,float和double。

数据类型变量内存大小
charchar ch ='a';1个字节
intint i = 10;2字节
floatfloat f = 12.34;4字节
doubledouble 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个字节存储指针变量的整数值。

数据类型和指针的地址和大小将根据所使用的编译器而有所不同。