北京网站制作服务,安徽最新消息今天,网站怎样制作吸引人,wordpress拖拽上传本篇文章将接着上篇继续介绍C语言的基础知识#xff0c;那么对于C语言大部分初学者会觉得难以理解#xff0c; 所以作者将指针单独拿出来写篇较短的文章进行讲解。 1.指针 1.1 内存 要学习指针#xff0c;就先要了解内存。一起来看。 内存是计算机中的关键组成部分#xff… 本篇文章将接着上篇继续介绍C语言的基础知识那么对于C语言大部分初学者会觉得难以理解 所以作者将指针单独拿出来写篇较短的文章进行讲解。 1.指针 1.1 内存 要学习指针就先要了解内存。一起来看。 内存是计算机中的关键组成部分用于存储数据和程序。每个内存单元的大小通常是1字节这意味着它可以存储8位的二进制数据每个位可以是0或1。 当计算机需要访问内存中的特定位置时它需要生成一个地址以便指示内存控制器要读取或写入哪个内存单元的数据。对于32位的计算机生成地址的过程涉及到32根地址线。 这些地址线的状态通电或不通电以二进制形式表示。例如如果计算机有32根地址线它们可以同时处于以下状态 00000000 00000000 00000000 00000000对应000000000 00000000 00000000 00000001对应1...11111111 11111111 11111111 11111111对应最大的32位二进制值 这些地址线的不同组合产生不同的二进制地址。每个不同的地址都对应一个内存单元1字节因此对于32位电脑来说它可以管理的最大内存容量为4GB千兆字节。 所以如果一个内存单元的大小是1字节并且计算机使用32位地址线那么它可以管理的最大内存容量就是4GB。这意味着它可以同时访问和处理4GB的数据和程序。这种地址线和内存容量的关系对计算机的性能和功能有重要影响因此在计算机硬件设计中非常重要。 如何理解内存? 这个时候就要类比生活中的例子. 在生活中有许多的居民楼, 居民楼里面整个空间就被划分为一个个房间, 对每个房间进行编号, 这样就能很好的知道每个房间的位置. 假如要送外卖到某个房间, 那么只要知道客户的地址, 也就是房间的编号就可以准确无误的送达. 那么内存也是一样的, 内存就相当于上面例子中的居民楼, 划分出的单元房间的编号就是内存单元的地址. 当给内存空间的每个单元编号, 有地址了之后, 需要找到哪个内存空间就会非常的方便. 总结如下: 内存划分成一个个小的内存单元每个内存单元的大小是1个字节. 为了能够有效的访问到内存的每个单元就给内存单元进行了编号这些编号被称为该内存单元的地址. 上图中的编号为十六进制 1.2 变量在内存中的存储 变量是创建内存中的(在内存中分配空间的)每个内存单元都有地址所以变量也是有地址的。 编写以下代码进行调试, 来查看变量在内存中的存储. int main()
{int a 10; // 向内存申请 4 个字节的空间, 存储 10a; // 取地址操作符return 0;
} 如果需要看内存也可以在调试-窗口-内存打开内存调试窗口进行查看.(注意这里面的窗口必须是先开始调试才能看到监视/内存窗口) 输入a, 按下回车可以看到, 内存窗口中的地址和上方监视窗口显示的a的值是相同的. 十进制: 0 1 2 3 4 5 6 7 8 9 八进制: 0~7 十六进制: 0~9 a b c d e f 十进制的10 转化为二进制: 0000 0000 0000 0000 0000 0000 0000 1010 再转化为十六进制: 0 0 0 0 0 0 0 a 即: 0x 00 00 00 0a 到内存中则倒序存储(暂时不解释为什么倒序) 所以可以看到, 内存中确实存储了数据10. 通过%p可以打印a的地址. 1.3 指针变量存储地址 1.3.1 指针与指针变量 我们在前面打印的a的地址, 是个十六进制的数字, 下面我们假设a的地址为0x0012ff40(凭空捏造出来的地址, 用以说明), 那么这个地址也是可以像int a 10;把10存进a中一样, 将这个地址存进某个变量中, 如下所示. int* p a; 把a的地址取到, 放到p中, 那么p的变量类型为int*. 此时, 这个变量p就叫做指针变量. 我们前面有聊到内存单元, 每个内存单元都有编号, 那么这个编号其实就是地址, 而这个地址也别称为指针. 所以指针就是地址. 上面的p是用来存a的地址的, 也就是存a的编号, 也就是存a的指针. 所以把存放地址, 存放指针的变量叫做指针变量. 当p是指针变量的时候如何理解它? 1.3.2 存储地址的意义 我们通过地址可以找到地址上的对象, 现在p中存放了a的地址, 那么就可以通过p找到a. *p; *是解引用操作符, 这里意思是通过 p中存放的地址, 找到 p所指向的对象, *p 就是 p 指向的对象, 也就是 a. int main()
{int a 10;printf(%p\n, a);int* p a; printf(%d\n, a);*p 20;printf(%d\n, a);return 0;
} 1.3.3 指针变量的大小 不管是什么类型的指针, 都是在创建指针变量. 指针变量是用来存放地址的, 它的大小取决于一个地址存放需要的大小. 32位平台下地址是32个bit位 (即4个字节) 64位平台下地址是64个bit位 (即8个字节) int main()
{printf(%zu\n, sizeof(char*)); // 4printf(%zu\n, sizeof(short*)); // 4printf(%zu\n, sizeof(int*)); // 4printf(%zu\n, sizeof(float*)); // 4printf(%zu\n, sizeof(double*)); // 4return 0;
} 2.结构体 之前我们已经有学过各种数据类型, 比如char, short, int, long, float, double等等, 但是这些类型不能表示所有的情况, 因为这些类型表示一些数值是没有任何问题的, 但是如果需要表示一个复杂对象, 比如要表示 人.就得要有名字, 年龄, 性别, 地址, 电话. 再比如表示一本 书. 就得要有书名, 作者, 出版社, 定价, 书号. 所以要表示一个复杂对象就不能用简单的数据类型表示, 这个时候C语言就给了程序员自定义类型的能力, 自定义类型中有一种是结构体. 结构体是把一些单一类型组合在一起的做法. // 学生
struct Stu
{// 成员char name[20];int age;char sex[10];char tele[12];
};void print(struct Stu* ps)
{printf(%s %d %s %s\n, (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);// - // 结构体指针变量-成员名printf(%s %d %s %s\n, ps-name, ps-age, ps-sex, ps-tele);}
int main()
{// 结构体初始化struct Stu s {zhangsan, 20, nan, 01234567890};// 结构体对象.成员名printf(%s %d %s %s\n, s.name, s.age, s.sex, s.tele);print(s);return 0;
}