2017-07-26 12 views
0

我正在學習C語言並做了很多練習。我明白***.c函數中的指針。int *和double **對於C函數參數外的元素有什麼意義?

請考慮下面的函數(另一.c功能)

void pcc(int* n, int* d, int* family, int* type, double* par, double* nu, double* out) 
{ 
    int i, j, in=1, k, **fam; 
    double *w, **v, t, **theta, **x, **ny; 

    …some works 

} 

我的問題是,爲什麼我們使用指針的函數的自變量?因爲據我所知我們使用指針指向以前識別的元素。

另外,爲什麼我們使用指針來指定一些尚未在函數參數中定義的元素。例如,在過去的功能,我們編寫函數的參數後定義一個新的元素:

int i, j, in=1, k, **fam; 
     double *w, **v, t, **theta, **x, **ny; 

例如,double *w是不是在函數的自變量!還有**v等元素。我們如何知道他們必須獲得***

請幫忙嗎?

+0

我建議你閱讀C教科書中處理指針的章節。 –

+0

謝謝你的建議,我沒有C教科書!我剛剛在網站上閱讀了一些教程。我試圖找到一本很好的教科書,但我無法得到一個好的教科書。 – Alice

+1

[此鏈接](https://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)可能會有所幫助。 –

回答

2

聲明一個變量a *或**的原因是無數的,最好試着去掌握它們的實際含義,而不是掛在爲什麼在這個特定實例中使用它們。

指針*是對存儲位置的引用,其中存儲值。在char的情況下,它是對一個存儲字節的單個內存位置的引用,對於int而言,它通常是32位系統上的4個字節。

您可以傳遞一個指針作爲參數來指示這是您希望存儲結果的位置。另一個原因可能是效率。如果你有一個非常大的struct ,最好將一個4byte(在一個32位系統上)引用傳遞到結構所在的內存區域,而不是將整個結構加載到堆棧上。

A **是一個雙指針。它指向一個特定的內存位置,它本身正在存儲別的內存位置。

char a[5]; 

這裏,變量a實際上是一個char *,指向[]的第一個元素,即a [0]。

char a[5][5]; 

這裏,是一個char **,指向a [] []的第一個元素,即A [0],這將返回一個char *在指着[0] [0]。

第二個例子是當你想擺弄指針時更好。也許你有一個char **(一個'字符串數組'),並且你想要替換其中一個'字符串'(一個字符串只是c中的一個char []],你只需要改變char *指向的char *字符**)。

我希望這可以讓你更清楚一點。

1

在C中,傳統上使用指針來修改在與您的函數不同的範圍聲明的變量。

儘管指向指針的指針(**)通常用於想要以某種方式操縱這些地址的情況。

現在,當你問:

我們怎麼知道他們必須得到***

那麼這取決於你想要對數據做什麼。如果你想操縱這個值,你只需要一個指針;如果你想操縱地址,你可能需要一個指向指針的指針。

0

使用指針時,我們希望位置的值,而不僅僅是。現在我們爲什麼要這樣?一個簡單的情況實際上是在你的問題中說明的在c中,從函數返回多個值通常是不方便的(如果不是不可能的話)。一個簡單的方法來解決這個問題就是用指針!當您將參數傳遞到一個正常的功能,例如

int myFunction(int some_parameter); 

你實際上是在傳遞一個複製 SOME_PARAMETER到您的功能。函數返回時,some_parameter的原始值不變。但是如果我們想要改變函數中的some_parameter呢?我們將指針改爲該值。這允許我們直接改變some_parameter在其原始內存位置的值,而不是副本。所以你可以看到,如果我們不是有

void myFunction(int* parameter1, int* parameter2) { 
    *parameter1 = 1; 
    *parameter2 = 2; 
} 

當你退出功能,你的價值觀參數1和參數2將1和2分別,即使你從來沒有真正返回的值! 指針是關於c的最有用也是最困難的部分之一,我建議您參考其他人選擇的其他來源以瞭解更多關於它們的信息。

相關問題