c语言char转换成int C语言指向char和int的指针
日常中,我们把笔记写到记事本中,记事本就相当于一个载体(存储笔记的内容)。C语言中有些变量,例如,char、int类型的变量,它们也需要一个载体,来存储这些变量的值,这个载体就是内存。比如我们的电脑内存有4GB内存,也就是4*1024*1024*1024=4294967296字节。
我们可以把整个内存想象成一串连续格子,每个格子(字节)都可以放入一个数据,如下图所示。
每一个小格子都有一个编号,小格子的编号从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个字节来存储的,
总结:
- 所用变量不论是普通变量(char,int)还是指针变量,都存在内存中。
- 所有变量都可以保存某些值。
- 怎么使用指针?
取值
移动指针
实例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个字节来存储的。
- 步骤二
我们把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(用四个字节来存储)。
由于内存的存储方式是,小端模式:低字节的数据放在低地址,高字节的数据放在高地址。在内存中的存储格式如下图所示。
- 步骤三
我们辛辛苦苦定义的指针类型变量,我们要把它用起来了,下面我们来分析一下,用指针来取值,‘*’:表示取指针变量存储地址的数据。
我们在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的内容。如图
实例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个字节如图:
- 步骤二
在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是字符型指针变量,一次只能访问一个字节,需要四次才能访问完。如图所示:
结论:
- 指针变量所存储的内容是所指向的变量在内存中的起始地址。
- &变量:
目的:获得变量在内存中的地址;返回:变量在内存中起始地址;
「新品首发」STM32MP157开发板火爆预售!首批仅300套
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com