有啊,百度一下就能知道的东西
啊啊啊啊啊啊
这里简单回答一下 避免以后有人看到
第一点 这个 问题 在 C 语言 和C++ 结果 可能会有区别 而且 在不同编译器可能也会有区别
这里没有测试 不纠结不同编译器 的结果
首先如果 是C 语言 输出结果应该都是 修改后的结果
正常的预期是 不同编译结果也都是一样的 都是 修改后的结果
但是在C++里面 输出的 两个值 确是不同的 大部分编译器都是不同的
这里是因为C++ 对const 常量 进行了 优化
如果想具体了解 可以百度 “ C++ 常量折叠” 很容易找到 结果很多
还有就是 如果 你认为你写的 是C语言的代码 跟C++没有关系?
这里可以给你个简单的建议 把 上面代码 复制 保存到.c 文件 看看 就知道了
因为 楼主 是用cpp 文件保存的 所以 一般情况下,编译器看见cpp 文件 直接默认就用cpp 方式编译了
c语言的好理解 毕竟 就是 同一个值 修改了 也一起修改
c++ 因为引入了 优化
这里有个 常量 符号表 默认常量 会在 符号表保存 默认值 使用时 默认从 常量表取值
而 指针指向的 是 这个值得具体内存 所以就是说 确实 有2分 不同的值 保存了
这样 也有一个好处就是 如果你修改了 const 的值 在使用的时候 使用的 还是未修改的
既然是const 就是 不能修改的 所以 这个优化 可以为你带来的 好处就是你不小心修改了常量
而使用时候 确实未修改的 这样 有时候 是有助于 程序健壮性的
这个操作系统叫ubuntu-linux
这个命令行叫terminal
代码编辑器叫vim
调试软件叫GDB
正常情况下 地址的分配简单的理解为 按 源代码 从上往下 没有问题
一般情况下 是这样 。 这里可能 编译器 如果优化 或许 会不一样 但是暂时 不考虑这个情况
但是 在你的代码里 这些 变量 是分配到 系统的栈内存 的 栈内存 跟操作系统内核 一样在高位
就是 假设你是32位系统 系统内存 占用2g 内存
那么 你的地址 大概分配情况就行
0x FF FF FF FF 这个是内存的 首地址
然后 往下一直是内核地址
直接到 2g内存结束 大概 位置为 1000 0000 0000 0000 0000 0000 0000 0000 就是 0x 80 00 00 00
然后栈内存的首地址 位置为 0111 1111 1111 1111 1111 1111 1111 1111 就是 0x 7F FF FF FF
从上 往下依次越来越小
所以你看到的确实是 内存地址的值 变小了 你测试的是对的
但是你没有注意 课程里说的 从高地址开始分配
//vi 下如果是插入,不要移动方向键,当能用回车,按ESC可以用方向键,,移动后按i插入,默认在光标的前面, 在ESC状态下shift+a回到本行末尾,并自动切换为插入模式
a发的地址应该比b的地址小一些啊,怎么a的地址反而大些?
1,0XFF FF FF FF 应该是8个F
2,8bit 是代表8个二进制位 8个二进制 可以用一个字节表示 1 Byte 64位就是8个字节 8byte
3,既然是64位 那么 我们定义指针 一般 也会使用 64来表示一个地址,相对于 64位的系统 一般表示 一次能计算的数据长度是64位,还有寄存器 什么的 也是64位的 这个就是硬件了。那么 如果一个地址用64位来表示 在 实现上 相对来说比较简单 这个实现 不是说地址线 一般地址线 应该是50左右吧 或者更少
4,既然使用了64位 来操作 地址 那么 理论上64位 数字能表达的最大范围确实就是 0XFF FF FF FF
但是实际上确实 没有 这么大的内存 。确实很多位 理论上用不到
不过一般情况下这个地址 是个虚拟地址 只是映射到具体地址 之前看到的,这个就由操作系统来做映射了
还有就是 这样 有一个 好处就是 操作系统 可以 使用虚拟技术
让你以为 内存 足够大 而可以给你的 应用分配 理论上超出实际内存 的空间 来使用
那些 编号 既然不是真实的 所以你使用时候 也不必关心 他到底 真实值是多少 交给系统就好了
//赋值一个,多个赋值则用for循环
int i = 3;
int *p = &i;
int str[10] = {0};
str[0] = *p;
可以对内存操作但是不直接对地址操作
指针是存放这地址,地址指向的那段内存是什么,指针就代表着什么,指针的运算,是其指向的那段内存地址变更,
http://www.imooc.com/qadetail/89162?t=199962#id_199962
因为指针是直接访问内存的,就好像你找东西直接有东西的地址一下就找到了,数组需要一个地址一个去找,所以指针操作效率高
等号左边的意思是定义一个函数指针pquadrate,将quadrate函数的地址赋给pquadrate,quadrate是一个返回值是int,有一个int参数的函数。
推荐你一个不错的网站,百度搜索C++技术网,第一个就是了,里面有一些C语言的教程,那些人写得挺用心,通俗易懂,能学的东西还挺多,这个网站还有很多不错的资源可以下载,例如电子书,IDE等,如果你技术上来了,还可以去做一下里面的练习小项目,感觉收获丰富。
是的,指针可以指向任何地址,所以也可以指向指针的地址,这种指针就被称作“二级指针”了。
是。。
int *pa = &a;
是以下代码的缩短形式:
int *pa;
pa = &a;
所以
pa = &a
*pa = a