首页 > 编程知识 正文

c语言强制类型转换int(int char区别)

时间:2023-05-04 05:34:10 阅读:103579 作者:1039

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

我们可以把整个内存想象成一系列连续的网格,每个网格(字节)可以容纳一个数据,如下图所示。

每个单元格都有一个数字,单元格的数字从0开始。我们可以通过读取单元格编号来获取单元格内容。同样,我们根据变量的地址获取内存中的数据。编写一个小程序进行测试,例如:

点_测试. c

#包含stdio.h

int main(int argc,char *argv[])

{

printf('sizeof(char )=%dn ',sizeof(char));

printf('sizeof(int )=%dn ',sizeof(int));

printf('sizeof(char *)=%dn ',sizeof(char *);

printf('sizeof(char **)=%dn ',sizeof(char * *);

返回0;

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

编制

gcc -o指针_测试指针_测试. c

运行应用程序:/pointer_test结果:(我使用64位编译器)

sizeof(char )=1

sizeof(int )=4

sizeof(char *)=8

Sizeof(char **)=8可以看出,在64位机器中,指针是用8个字节来表示的,我们可以用32位机器来测试编译。

编译:

Gcc-m32-o指针_ test pointer _ test . c//plus * *-m32 * * 3360编译成32位机器码时,可能会出现以下提示错误:

/usr/include/features . h :374:253360致命错误: sys/CDE fs . h :没有这样的文件或目录要解决该错误,请安装lib32readline-gplv2-dev,并执行:

o Suda pt-get install lib 32 readline-GPL v2-dev重新编译

Gcc-m32-o指针_ test pointer _ test . c//运行生成的应用程序没有错误。/pointer_test结果:

sizeof(char )=1

sizeof(int )=4

sizeof(char *)=4

Sizeof(char **)=4可以看到,机器码编译成32位,指针存储在4字节。

总结:

使用的变量,无论是普通变量(char,int)还是指针变量,都存储在内存中。所有变量都可以保存某些值。如何使用指针?价值

移动指针

00-1010步骤1 # inclustdio.h

void test0()

{

char c;

char * pc

/*第一步是:所有变量都存储在内存中。让我们打印变量的存储地址*/

printf('c=%pn ',c);

校长

tf("&pc =%pn",&pc); } int main(int argc, char *argv[]) { printf("sizeof(char ) = %dn",sizeof(char )); printf("sizeof(int ) = %dn",sizeof(int )); printf("sizeof(char *) = %dn",sizeof(char *)); printf("sizeof(char **) = %dn",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个字节来存储的。

步骤二

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

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

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

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

printf("c =%cn",c); printf("pc =%pn",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(用四个字节来存储)。

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

步骤三

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

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

printf("*pc =%cn",*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的内容。如图

实例1

步骤一

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

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

main.c

int main(int argc, char *argv[]) { printf("sizeof(char ) = %dn",sizeof(char )); printf("sizeof(int ) = %dn",sizeof(int )); printf("sizeof(char *) = %dn",sizeof(char *)); printf("sizeof(char **) = %dn",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个字节如图:

步骤二

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

/*第二步:所有变量都可以保存某些值,接着赋值并打印*/ ia = 0x12345678; pi = &ia; pc = (char *)&ia; printf("ia =0x%xn",ia); printf("pi =%pn",pi); printf("pc =%pn",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%xn",*pi); printf("pc =%pt",pc); printf("*pc =0x%xn",*pc); pc=pc+1; printf("pc =%pt",pc); printf("*pc =0x%xn",*pc); pc=pc+1; printf("pc =%pt",pc); printf("*pc =0x%xn",*pc); pc=pc+1; printf("pc =%pt",pc); printf("*pc =0x%xn",*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是字符型指针变量,一次只能访问一个字节,需要四次才能访问完。如图所示:

结论:

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。