c语言char转换成int C语言指向char和int的指针

c语言char转换成int C语言指向char和int的指针(1)

日常中,我们把笔记写到记事本中,记事本就相当于一个载体(存储笔记的内容)。C语言中有些变量,例如,char、int类型的变量,它们也需要一个载体,来存储这些变量的值,这个载体就是内存。比如我们的电脑内存有4GB内存,也就是4*1024*1024*1024=4294967296字节。

我们可以把整个内存想象成一串连续格子,每个格子(字节)都可以放入一个数据,如下图所示。

c语言char转换成int C语言指向char和int的指针(2)

每一个小格子都有一个编号,小格子的编号从0开始,我们可以通过读取格子的编号,得到格子里面的内容。同理,我们根据内存的变量的地址,来获得其中的数据。下面写个小程序进行测试,实例:

point_test.c

#include <stdio.h> int main(int argc, char *argv[]) { printf("sizeof(char ) = %d\n",sizeof(char )); printf("sizeof(int ) = %d\n",sizeof(int )); printf("sizeof(char *) = %d\n",sizeof(char *)); printf("sizeof(char **) = %d\n",sizeof(char **)); return 0; }

根据程序可以看出来,函数的功能是输出,char,int,char **类型所占据的字节数;

编译

gcc -o pointer_test pointer_test.c

运行应用程序:

./pointer_test

结果:(我用的是64位的编译器)

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 8 sizeof(char **) = 8

可以看出在64位的机器中,用8个字节表示指针,我们可以测试一下用32位的机器编译

编译:

gcc -m32 -o pointer_test pointer_test.c //加上**-m32**:编译成32位的机器码

编译可能会出现下面提示错误:

/usr/include/features.h:374:25: fatal error: sys/cdefs.h: No such file or directory

解决错误,安装lib32readline-gplv2-dev,执行:

sudo apt-get install lib32readline-gplv2-dev

重新编译

gcc -m32 -o pointer_test pointer_test.c //没有错误

运行生成的应用程序

./pointer_test

结果:

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 4 sizeof(char **) = 4

可以看出编译成32位的机器码,指针就是用4个字节来存储的,

总结:

  1. 所用变量不论是普通变量(char,int)还是指针变量,都存在内存中。
  2. 所有变量都可以保存某些值。
  3. 怎么使用指针?

取值

移动指针

c语言char转换成int C语言指向char和int的指针(3)

实例0
  • 步骤一

#include <stdio.h> void test0() { char c; char *pc; /*第一步 : 所有变量都保存在内存中,我们打印一下变量的存储地址*/ printf("&c =%p\n",&c); printf("&pc =%p\n",&pc); } int main(int argc, char *argv[]) { printf("sizeof(char ) = %d\n",sizeof(char )); printf("sizeof(int ) = %d\n",sizeof(int )); printf("sizeof(char *) = %d\n",sizeof(char *)); printf("sizeof(char **) = %d\n",sizeof(char **)); printf("//==============\n"); test0(); return 0; }

编译:

gcc -m32 -o pointer_test pointer_test.c

运行:

./pointer_test

结果:

sizeof(char ) = 1sizeof(int ) = 4sizeof(char *) = 4sizeof(char **) = 4//==============&c =0xffaaa2b7&pc =0xffaaa2b8

从运行的结果我们可知,变量c的地址编号(即地址)是0xffaaa2b7,指针变量pc的地址编号是0xffaaa2b8,如下图所示,编译成32位的机器码,字符类型占用一个字节,指针类型就是用4个字节来存储的。

c语言char转换成int C语言指向char和int的指针(4)

  • 步骤二

我们把test0()函数里面的变量保存(赋予)一些值,假如这些变量不保存数据的话,那么存储该变量的地址空间就会白白浪费,就相当于买个房子不住,就会白白浪费掉。

我们把上面程序中的test0()函数里面的字符变量c,指针变量pc进行赋值。

c = ‘A’; //把字符‘A’赋值给字符变量cpc = &c; //把字符变量c的地址赋值给指针变量pc

然后把赋值后变量的值打印出来

printf("c =%c\n",c); printf("pc =%p\n",pc)

编译:

gcc -m32 -o pointer_test pointer_test.c

运行:

./pointer_test

结果:

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 4 sizeof(char **) = 4 //============== &c = 0xffb009b7 &pc = 0xffb009b8 c = A pc = 0xffb009b7

从运行的结构来看字符变量和指针变量的地址编号发生了变化,所以在程序重新运行时,变量的地址,具有不确定性,字符变量c存储的内容是字符‘A’,指针变量pc存储的内容是0xffb009b7(用四个字节来存储)。

由于内存的存储方式是,小端模式:低字节的数据放在低地址,高字节的数据放在高地址。在内存中的存储格式如下图所示。

c语言char转换成int C语言指向char和int的指针(5)

  • 步骤三

我们辛辛苦苦定义的指针类型变量,我们要把它用起来了,下面我们来分析一下,用指针来取值,‘*’:表示取指针变量存储地址的数据。

我们在test0()函数里面添加如下代码:

printf("*pc =%c\n",*pc); printf("//=================\n");

编译:

gcc -m32 -o pointer_test pointer_test.c

运行:

./pointer_test

结果:

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 4 sizeof(char **) = 4 //============== &c =0xfff59ea7 &pc =0xfff59ea8 c =A pc =0xfff59ea7 *pc =A //=================

指针变量pc存储的内容是是字符变量c的地址,所以*pc就想相当于取字符变量c的内容。如图

c语言char转换成int C语言指向char和int的指针(6)

实例1
  • 步骤一

我们在上面函数的基础上,写一个函数test1()

void test1() { int ia; int *pi; char *pc; /*第一步 : 所有变量都保存在内存中,我们打印一下变量的存储地址*/ printf("&ia =%p\n",&ia); printf("&pi =%p\n",&pi); printf("&pc =%p\n",&pc); }

main.c

int main(int argc, char *argv[]) { printf("sizeof(char ) = %d\n",sizeof(char )); printf("sizeof(int ) = %d\n",sizeof(int )); printf("sizeof(char *) = %d\n",sizeof(char *)); printf("sizeof(char **) = %d\n",sizeof(char **)); printf("//==============\n"); //test0(); test1(); return 0; }

我们在test1()函数中定义了一个整型变量ia,定义了一个指向整型的指针变量pi,定义了一个指向字符型的指针变量pc。然后打印出这些变量的地址。

编译

gcc -m32 -o pointer_test pointer_test.c

运行:

./pointer_test

结果:

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 4 sizeof(char **) = 4 //============== &ia =0xffc936e4 &pi =0xffc936e8 &pc =0xffc936ec

在32位的系统中int类型变量在内存中占用4个字节,指针型变量在内存中占用4个字节如图:

c语言char转换成int C语言指向char和int的指针(7)

  • 步骤二

在test1()的函数中对定义的变量进行赋值,然后把赋值的结果打印出来。

/*第二步:所有变量都可以保存某些值,接着赋值并打印*/ ia = 0x12345678; pi = &ia; pc = (char *)&ia; printf("ia =0x%x\n",ia); printf("pi =%p\n",pi); printf("pc =%p\n",pc);

编译

gcc -m32 -o pointer_test pointer_test.c

运行:

./pointer_test

结果:

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 4 sizeof(char **) = 4 //============== &ia = 0xffb6f724 &pi = 0xffb6f728 &pc = 0xffb6f72c ia = 0x12345678 pi = 0xffb6f724 pc = 0xffb6f724

从结果可以看出来,变量pi和pc的值都等于变量ia的地址。

  • 步骤三

我们使用指针并且对其进行取值,然后移动指针,在test1中添加如下代码,完成所述要求

/*第三步:使用指针:1)取值 2)移动指针*/ printf("*pi =0x%x\n",*pi); printf("pc =%p\t",pc); printf("*pc =0x%x\n",*pc); pc=pc 1; printf("pc =%p\t",pc); printf("*pc =0x%x\n",*pc); pc=pc 1; printf("pc =%p\t",pc); printf("*pc =0x%x\n",*pc); pc=pc 1; printf("pc =%p\t",pc); printf("*pc =0x%x\n",*pc); printf("//=================\n");

编译

gcc -m32 -o pointer_test pointer_test.c

运行:

./pointer_test

结果:

sizeof(char ) = 1 sizeof(int ) = 4 sizeof(char *) = 4 sizeof(char **) = 4 //============== &ia =0xffee0930 &pi =0xffee0934 &pc =0xffee0938 ia =0x12345678 pi =0xffee0930 pc =0xffee0930 *pi =0x12345678 pc =0xffee0930 *pc =0x78 pc =0xffee0931 *pc =0x56 pc =0xffee0932 *pc =0x34 pc =0xffee0933 *pc =0x12

由于pi指向了ia,所以*pi的值为0x12345678。由于pc也指向了ia,但是由于pc是字符型指针变量,一次只能访问一个字节,需要四次才能访问完。如图所示:

c语言char转换成int C语言指向char和int的指针(8)

结论:

  1. 指针变量所存储的内容是所指向的变量在内存中的起始地址。
  2. &变量:

目的:获得变量在内存中的地址;返回:变量在内存中起始地址;

「新品首发」STM32MP157开发板火爆预售!首批仅300套

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页