改變指向二維數組的指針的指向……


我定義了一個二維數組, 和一個指向二維數組的指針

	int b[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };  
int *pb[3][4];

for (int i = 0; i < 3; i++)   //指針初始化
{
for (int j = 0; j < 4; j++)
{
pb[i][j] = *(b + i) + j;
}
}


然后我現在想通過一個二級指針  改變這個指向二維數組的指針的指向,  反向輸出 ……

	int(*p)[4] =b;  // 這是一個行指針  指向一個數組 每一個元素是int
int *(*pp)[4] = pb;  //指針, 指向一個數組有4個元素, 每個元素是 int*

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
pp[i][j] = *(p + i) + (3 - j); // 改變指針的指向  不改變原數組的值
                                                                // 反向
//pb[i][j] = *(b + i) + j;
}
}



 我想問一下, 為什么這里要是   pp[i][j]=*(p+i)+(3-j);     為什么 不是  *(pp[i][j])=*(p+i)+(3-j) ,  pp[i][j] 對應的不是 每個 pb 指針的地址么, 改變pb 指針的指向(即里面的內容) 不需要加 * ?  

然而我運行時 pp[i][j]=*(p+i)+(3-j); 是正確的,  *(pp[i][j])=*(p+i)+(3-j)   輸出錯誤……

8 个解决方案

#1


應該是這樣的吧,*(p+i) + (3-j)是一個指向第i行第3-j列的一個指針,你對它*一下就拿到了它所指向的具體數據了。
而pp[i][j]本來就是一個指向第i行j列的的指針,你對它*一下拿到的是它的指針。
所以pp[i][j]  = *(p+i) + (3-j)就是把指針賦給一個指針是對的,而你對左值*后就相當於要把一個指針賦給一個int,系統會報錯

#2


http://edu.csdn.net/course/detail/2516 C語言指針與匯編內存地址-三.數組和二維數組

#3


p是一個指針,類型是 int[4] * 。 *p類型是int[4],仍然是一個指針。
如果 int a[4] = {1,2,3,4};  那么p相當於&a,類型是int[4] * 。 *p相當於a,類型是int[4]。而數組名就是個指針。 所以p和*p都是指針,只不過意義不一樣。

#4


int b[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };  
int (*pb)[4];   /*應該定義這樣*/
 
for (int i = 0; i < 3; i++)   //指針初始化
{
    for (int j = 0; j < 4; j++)
    {
        pb[i][j] = *(b + i) + j;
    }
}

pb應該定義成int (*pb)[4]類型

#5


引用 1 樓 pgao02 的回復:
應該是這樣的吧,*(p+i) + (3-j)是一個指向第i行第3-j列的一個指針,你對它*一下就拿到了它所指向的具體數據了。
而pp[i][j]本來就是一個指向第i行j列的的指針,你對它*一下拿到的是它的指針。
所以pp[i][j]  = *(p+i) + (3-j)就是把指針賦給一個指針是對的,而你對左值*后就相當於要把一個指針賦給一個int,系統會報錯


  你看我下面那注釋都對嗎?    我在最下面那個printf 前面設置了一個斷點, 下面一張圖片是輸出的值,  好奇怪,  為什么 pp[i][j] 和 pb[i][j] 的值相同,而不是 pp[i]和 &pb[i][j]  ?    
 



#6


引用 1 樓 pgao02 的回復:
應該是這樣的吧,*(p+i) + (3-j)是一個指向第i行第3-j列的一個指針,你對它*一下就拿到了它所指向的具體數據了。
而pp[i][j]本來就是一個指向第i行j列的的指針,你對它*一下拿到的是它的指針。
所以pp[i][j]  = *(p+i) + (3-j)就是把指針賦給一個指針是對的,而你對左值*后就相當於要把一個指針賦給一個int,系統會報錯


 還可以再幫回答下么 …我可以加分 

#7


可以看看這個
http://blog.csdn.net/goldenhawking/article/details/78171742
里面介紹了現代C++的幾種管理多維數組的方法范例。

#8


我想問一下, 為什么這里要是   pp[i][j]=*(p+i)+(3-j);     為什么 不是  *(pp[i][j])=*(p+i)+(3-j) ,  pp[i][j] 對應的不是 每個 pb 指針的地址么, 改變pb 指針的指向(即里面的內容) 不需要加 * ?  
然而我運行時 pp[i][j]=*(p+i)+(3-j); 是正確的,  *(pp[i][j])=*(p+i)+(3-j)   輸出錯誤……
針對這個問題我說說我的看法,首先從語法上來講應該這么寫,如下:
*pp[i][j] = *(*(p + i) + (3 - j));

第二個問題是,解決語法問題了,又帶來了一個新問題,那是值的問題,這不是改變指針的指向位置,而是改變了指針的值,這就會導致只有一半的值倒敘,還有一半重復值,形成,用矩陣的形式輸出就會看見一個對稱

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: