c – 当访问ptr [i] [j]时,为什么int ** ptr指向与int arr [3] [3]相同的地址?

c – 当访问ptr [i] [j]时,为什么int ** ptr指向与int arr [3] [3]相同的地址?,第1张

概述我正在回答这个 question,但是当我测试以下代码时 我很困惑. #include <iostream>using namespace std;int main(){ int **ptr; int arr[3][3]; ptr =(int **) arr; for (int i=0;i<3;i++){ 我正在回答这个 question,但是当我测试以下代码时
我很困惑.

#include <iostream>using namespace std;int main(){        int **ptr;        int arr[3][3];        ptr =(int **) arr;        for (int i=0;i<3;i++){                for (int j=0;j<3;j++){                        cout << &arr[i][j] << " =? ";                        cout << &(ptr[i][j]) << endl;                }        }        return 0;}

但是我得到了这个输出:

0x7fff5700279c =? 00x7fff570027a0 =? 0x40x7fff570027a4 =? 0x80x7fff570027a8 =? 00x7fff570027ac =? 0x40x7fff570027b0 =? 0x80x7fff570027b4 =? 00x7fff570027b8 =? 0x40x7fff570027bc =? 0x8

他们为什么不一样?

解决方法 int ** ptr和int arr [3] [3]是不同的,因为:

-----------------------------------|    C    |         Maths           | -----------------------------------| ptr + 1 | ptr + sizeof(int*)      | -----------------------------------| arr + 1 | arr + 3 * sizeof(int*)  | -----------------------------------

所以你根本得不到相同的结果(此外,ptr和arr可能没有相同的内存表示).

int (*ptr)[3] = arr;

将工作,因为只有arr的第一个维度衰减到指针.

总结

以上是内存溢出为你收集整理的c – 当访问ptr [i] [j]时,为什么int ** ptr指向与int arr [3] [3]相同的地址?全部内容,希望文章能够帮你解决c – 当访问ptr [i] [j]时,为什么int ** ptr指向与int arr [3] [3]相同的地址?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存