C語言函式,陣列與指標

2021-09-24 03:22:39 字數 1698 閱讀 8651

int sum(int *ar);//對應的函式原型
sum()獲得了該陣列首元素的位址。但是,該引數並未包含陣列元素個數的資訊,我們有兩種方式讓函式獲得這一資訊。

第一,在函式**中直接寫上固定陣列的大小。

int sum(int *ar)

該函式上面的定義,限制了智慧型計算10個int型別的元素。

第二種方法:把陣列大小作為第二個引數。這是非常常用的方法,也非常常見。

int sum(int *ar,int n)  //更常用的方法

; long answer;

answer=sump(marbles,marbles+size);

printf("%ld\n",answer);

return 0;

}int sump(int *start,int *end)

return total;

}

賦值表示式: total+=*start 把首元素10加給total。然後表示式start++遞增指標變數start,使其指向陣列的下一元素。start位指向int的指標,遞增1相當於其值遞增int型別的大小。

另外,迴圈體可以進一步簡寫為:

total+=*start++

這裡就又涉及到指標運算中的優先順序

一元運算子星號和++優先順序相同,但結合律是從右至左,所以start++先求值。然後才是星號start。即為:指標先遞增後指向。也就是先把指標指向的值加到total上,再遞增指標。若反過來,就為先遞增指標,再使用指標指向的值。

如果是(*start)++則是先使用start指向的值,在遞增該值,而不是遞增指標。指標將一直指向同乙個位置,但是該位置上的值發生了變化。

再附上乙個栗子,幫助更好的理解運算優先順序。

#includeint data[2]=;

int moredata[2]=;

int main(void)

執行結果:

*p1=100, *p2=100 ,*p3=300

*p1++=100, *++p2=100, (*p3)++=300

*p1=200, *p2=200, *p3=301

以上除了*p3改變了陣列元素的值,再首位址上加1,其餘均為指標移動。

最後在強調一點,不要使用未初始化的指標!!

錯誤示例:

int *pt;//未初始化

*pt=5; //嚴重錯誤

上面的是很嚴重的錯誤。由於建立乙個指標時,系統之分配了儲存指標本身的記憶體,並未分配儲存資料的記憶體,所以在使用前,必須用已分配的位址初始化它。

這兩種方法可解決未初始化的問題:

1.可用乙個現有變數的位址初始化指標。

2.或者使用malloc()函式分配記憶體。

題外話:本想著一次性把和指標有關的東西一次寫完,又覺得寫在乙個部落格裡把有的重點堆在一起,日後複習看起來感覺很亂。就單獨把指標變數的基本操作與指標形參單獨羅列出來記錄。重拾c並且進一步學習c是為了給接下來自學資料結構與演算法打乙個厚實的基礎,不得不說c primer plus真的是很好的一本書,知識真的很詳細,不過有的還是沒有講到,不過都等著我發現了,進一步挖掘最底層的東西。

指標 函式 陣列

1.指標函式 指標函式就是返回指標值的函式,本質是乙個函式。所以指標函式等價於 返回值為指標的函式 宣告形式 type func 引數列表 2.函式指標 函式指標就是乙個指向函式的指標。每個函式在編譯時,會被分配乙個入口位址,一般用函式名來表示,這個位址就是該函式的指標。宣告形式 type func...

c語言陣列與指標,函式與指標

學過c語言的人都知道,指標是c語言中比較複雜難理解的乙個知識點,想要理解透徹有些難度,所以在此辨析一些容易混淆的概念,整理了有關指標的知識點。首先,先來看幾個概念。指標變數存放位址的變數。變數指標 變數的位址。所以,我們常常聽到定義乙個指標,實際上是定義乙個指標變數,而不是定義乙個指標,指標既然是位...

函式指標,指標函式,陣列指標,指標陣列 區分

what why how 這些怎麼區分 函式指標 重點在指標,表示它是乙個指標,它指向的是乙個函式。eg int fun 指標函式 重點在函式,表示它是乙個函式,它的返回值是指標。eg int fun 陣列指標 重點在指標,表示它是乙個指標,它指向的是乙個陣列。int fun 8 指標陣列 重點在陣...