Pointer_6
来源:互联网 发布:java游戏引擎现状 编辑:程序博客网 时间:2024/05/16 11:14
#include <stdio.h>#include <string.h>struct myStruct{ int a; int b; int c;};int func(char* str){ // 统计字符串中各个字符的ASCII码值之和 int num = 0; int len = strlen(str); for(int i = 0; i < len; i++) { num += *str; str++; } return num;}void func_1(char* s){ char c; c = *(s + 3); *(s + 3) = *(s + 0); *(s + 0) = c; c = *(s + 1); *(s + 1) = *(s + 2); *(s + 2) = c;}int main(){ struct myStruct ss = {2, 3, 4}; struct myStruct *ptrStruct = &ss; int *p = (int*)ptrStruct; // 通过ptrStruct访问ss的三个成员变量 printf("%d\n", ptrStruct->a); printf("%d\n", ptrStruct->b); printf("%d\n", ptrStruct->c); printf("\n"); // 通过p来访问ss的三个成员变量,这样访问变量是不正规的 printf("%d\n", *p); printf("%d\n", *(p + 1)); printf("%d\n", *(p + 2)); // 所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存 // 放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的 // 各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是 // 别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导 // 致各个成员之间可能会有若干个字节的空隙。 // 即使*p访问到了结构对象ss 的第一个成员变量a,也不能保证*(p+1) // 就一定能访问到结构成员b。因为成员a 和成员b 之间可能会有若干填充字节, // 说不定*(p+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。 // 要是你的目的就是想看看各个结构成员之间到底有没有填充字节, // 嘿,这倒是个不错的方法。不过指针访问结构成员的正确方法应该是使用指针ptr char sz[20] = "test"; printf("%d\n", func(sz)); printf("\n"); int n1 = 125; printf("%d\n", n1); func_1((char*)&n1); printf("%d\n", n1); printf("\n"); // 注意这是一个32 位程序,故int 类型占了四个字节,char 类型占一个字节。 // 函数func_1的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗? // 在函数调用语句中,实参&n1的结果是一个指针,它的类型是int *, // 它指向的类型是int。形参这个指针的类型是char *,它指向的类型是char。 // 这样,在实参和形参的结合过程中,我们必须进行一次从int *类型到 // char *类型的转换。 // 我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char *temp, // 然后执行temp=(char *)&n1,最后再把temp 的值传递给s。所以最后的结果是: // s的类型是char *,它指向的类型是char,它指向的地址就是n1的首地址。 unsigned int n2 = 20345686; unsigned int *pn2 = (unsigned int *)n2; // 将一个无符号整数值转换为一个指针 // 间接引用n2时,会出现内存访问错误,但可以将地址输出 //printf("%d\n", *pn2); printf("0x%p\n", pn2); printf("\n"); pn2 = &n2; // 将一个无符号指针转换为无符号整数 unsigned int n3 = (unsigned int)pn2; printf("%d\n", n3); printf("0x%p\n", n3); // getchar()是一个缓冲函数,结束时,必须输入一个回车,getchar()函数才从 // 键盘缓冲区中读取字符 getchar(); return 0;}
阅读全文
0 0
- Pointer_6
- error: CreateProcess: No such file or directory
- Canvas 基本用法学习笔记
- 线程池,这一篇或许就够了
- 18多态
- 大数巨之某种序列
- Pointer_6
- 200、301、403、304、500等HTTP状态代表什么意思?
- Android开发:创建自定义视图–创建一个View类
- 使用poi操作模板文件重新生成新的word表单文件
- Android截屏与WebView长图分享经验总结
- spring 集成activemq
- C语言求1000以内水仙花数
- Promise 的含义(ES6 学习札记)
- EOS Platform7.6实体有字段默认值为null,调用queryEntitiesByTemplate,执行报错