簡體   English   中英

在C ++中將指針分配給指針

[英]Assigning Pointers to pointers in C++

我遇到過這樣的情況,我必須在函數中對矩陣做一些數學運算(在編譯時,它的維數未知,因此我必須將其保存為指針),然后將其等同於作為參數傳遞給功能。

每次代碼都會引發分段錯誤。 我在這里有一個示例代碼:

#include <iostream>
using namespace std;
void assign(int **a)
{
  int **A = new int* [3];
  int i, j;

  for(i = 0; i < 3; i++)
    A[i] = new int[3];

  for(i = 0; i < 3; i++)
    for(j = 0; j < 3; j++)
      A[i][j] = 100;

  a = A; /* equating the pointers */
}

int main()
{
  int **ptr;
  assign(ptr); /* Passing my pointer into the function */
  cout << ptr[0][0] << endl;
  return 0;
}

代碼是C ++,對於我來說,使函數具有除void以外的其他返回類型不是一種選擇。 而且我不想按行/列專業將矩陣保存在普通指針上-我需要知道為什么這行不通。

仔細看看您的代碼:

void assign(int** a)
{
    // ...
}

int main()
{
    int** ptr;
    assign(ptr);
}

你傳遞a由值-調用后assign(ptr)你不會修改ptr自身函數體內的,而僅僅是一個副本ptr

ptr作為參考:

void assign(int**& a)
{
    // ...
}

其他可能的解決方案:

  1. 添加另一個級別的間接。

     void assign(int*** a) { // ... *a = A; } int main() { int** ptr; assign(&ptr); } 
  2. assign返回。

     int** assign() { // ... return A; } int main() { int** ptr; ptr = assign(); } 

考慮一下內存中代碼中實際發生的情況。 這是一個示例,現在需要一些虛構的內存地址:

    in main():                                 in assign():
ptr at 0x0100, value: garbage_ptr
                                    call
                                   ----->
                                           a at 0x0200, value: garbage_ptr
                                           [after some computation]
                                           A at 0x0204, value: 0x0400
                                           [after the line: a = A;]
                                           a at 0x0200, value: 0x0400
ptr at 0x0100, value: garbage_ptr

您會看到如何將任何東西都寫到ptr的地址0x0100上。 這是因為aassign()獲取的 ptr ; 它不知道 ptr ptr仍然指向它的作用域在main()的開頭開始時所做的未更改的(垃圾)值。

現在,假設將代碼更改為:

...
void assign(int ***a)
{
    ...
    *a = A;
}

int main()
{
    int **ptr;
    assign(&ptr);
    ....

上面的插圖現在變為:

    in main():                         in assign():
ptr at 0x0100, value: garbage_ptr
&ptr rvalue, value: 0x0100
                                     call
                                   ----->
                                           a at 0x0200, value: 0x0100
                                           *a at 0x100, value: garbage_ptr
                                           [after some computation]
                                           A at 0x0204, value: 0x0400
                                           [after the line: *a = A;]
                                           a at 0x200, value: 0x0100
                                           *a at 0x100, value: 0x0400
                                   return
                                   <-----
ptr at 0x100, value: 0x0400

這樣, 0x0100的值確實得到更改,這就是您想要的。 (實際上,您應該在C ++中使用此類的引用,但是使用指針顯示錯誤更容易。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM