#define 定义常量和宏
define 是一个预处理指令
用途:1.define 定义符号
#define MAX 1000
int main()
{
printf("%d\n", MAX);
return 0;
}
2.define 定义宏
#define ADD(X,Y) ((X)+(Y))
int main()
{
printf("%d\n", ADD(2, 3));
return 0;
}
指针
内存
内存是计算机上特别重要的储存器,计算机中所有程序的运行都是在内存中进行的。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是一个字节。
为了能有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
这样,就引出来两个问题
1.内存是怎样进行编号的?
2.一个这样的内存单元是多大空间?
1.计算机分为32位和64位
32位:32根地址线——物理意义上的线,可以通电——正电是1负电是0
电信号转换为数字信号就可以得到0和1组成的二进制序列
00000000000000000000000000000000
00000000000000000000000000000001
......
011111111111111111111111111111111111
10000000000000000000000000000000
......
111111111111111111111111111111111111
会产生2的32次方这样的二进制序列,有2的32次方个内存单元
一个这样的二进制序列就是一个地址,即编号
2.假设一个内存单元是1bit,有2的32次方个内存单元,所以就有2的32次方个bit
用计算机算出,2的32次方对应4,294,967,296个bit
4,294,967,296 bit /8
=536,870,912 byte /1024
=524,288 kb /1024
=512 mb /1024
=0.5gb
由于这样管理过于细致以及浪费,最终决定以一个byte作为一个内存单元
最终,一个内存单元是一个字节,然后分配地址.
int main()
{
int a = 10;//a在内存中要分配空间-4个字节
printf("%p\n", &a);//%p 专门用来打印地址
return 0;
}
在vs输入如上代码,并F10调试,在到达printf行后,点击调试-窗口-内存-内存1
并在出来的窗口地址栏里输入&a,就可以看到a的地址
同样,在调试-窗口-监视-监视1中
在搜索栏里搜索&a,同样也能看到a的地址
int main()
{
int a = 10;//a在内存中要分配空间-4个字节
printf("%p\n", &a);//%p 专门用来打印地址
int* pa = &a;//pa是用来存放地址的,在C语言中被称为指针变量
//* 说明,pa是指针变量
//int 说明pa执行的对象是int类型
//举一反三:
char ch = "w";
char* pc = &ch;
return 0;
}
如上,* 说明后面的pa是指针变量,前面的int表明pa执行的对象是int类型
同样下面的代码,pc是指针变量,而它执行的对象是char类型
所以,我们可以取出一个变量的地址,但如果要存起来,那么就要用到指针变量。
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;//* 叫解引用操作符 *pa就是通过pa里面的地址,找到a
printf("%d\n", a);
return 0;
}
指针变量的大小
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(long long*));
printf("%d\n", sizeof(double*));
return 0;
}
发现所有的指针大小都是8
因为指针是用来储存地址的,指针需要多大空间,取决于地址的储存需要多大空间
所以指针的大小都是相同的
标签:int,pa,C语言,地址,初识,内存,printf,指针 From: https://blog.csdn.net/Changxin_Hou/article/details/140833000