標籤:struct 第一個 記憶體 下標 方式 部分 佔用 元素 包含
C語言非常重要的一個部分,提供了訪問變數的一種間接的方式——指標。通過變數的的地址我們可以訪問到這個變數,回顧一下以前,我們通過:
int counter = 10;
定義了一個int型的變數並且在後面的代碼中直接通過變數名counter來訪問這個變數。那麼現在採取一種新的方式來訪問這個變數(間接訪問)。我們可以:
int *counter_point = &counter;
定義了一個指標,這個指標指向了counter變數的地址。來分析一下這個文法結構:int代表了這個指標指向的地址儲存的資料類型是int整型,後面counter_point是指標,前面的*是表示指標的標誌。&是地址符,表明的是counter的地址。嚴格的來寫這句話應該是:
int *counter_point;
counter_point = &counter;
如果要訪問counter的值,我們現在可以通過這句話:
*counter_point直接得到counter的值,可以通過printf("counter = %i",*counter_point)函數來證實。當然還會有char型指標表示指向char資料的地址等其他類型指標。
指標和結構體:
當一個指標指向的是結構體的地址時:
struct date {
int year;
int month;
int day;
} myDate;
struct date *myDate_point = &myDate;
這時我們就可以像通常使用結構體的方式來使用:
間接訪問結構體的成員變數: (*myDate_poont).year或者可以使用myDate_point->year的文法格式來使用,後者是指標特有的。
結構體中包含指標:
struct date {
int *year;
int *month;
int *day;
} myDate;
struct date *myDate_point = myDate;
myDate_point->year = &a;//假定a是一個int值變數
*myDate_point->year = a;//*的邏輯層級低於->也就是低於.
關鍵字const:
首先const關鍵字的一個用途就是對於生命的變數,數組可以用來提醒編譯器和閱讀代碼的人其中的內容不可以修改。那麼對於指標來說需要考慮更多的問題:
假定已經聲明了一個字元變數c,則char *const charPtr = &c;這句話讀作charPtr是一個指向字元的常量指標。值得注意的是,現在指標指向固定的地址且不可以改變。如果後面寫上 charPtr = &a;則會報錯,因為常量指標地址不可以更改。const第二個位置是在const char *charPtr = &c;的含義是指向一個常量字元,這個意思表示不可以通過指標改變c的值,*charPtr = ‘abc‘;則會報錯。但是可以通過c本身來更改c的值。
指標和函數:
指標不僅可以指向變數的地址還可以指向函數的地址。例如: int (* point) (void)表示的是一個指向無參數但是返回一個int類型傳回值的函數。這裡需要展示一個案例:
1 //聲明函數2 int add(int a,int b){3 4 return a+b;5 6 //指標指向函數 注意其中對影的關係7 int (*add_point) (int num1,int num2) = &add;8 9 NSLog(@"*add_point(3,4) = %i",(*add_point)(3,4));
指標與數組
數組的問題我在其他章節已經介紹過,現在加上指標的概念則遞進一些概念和加深文法。C語言最常見的指標用法是指標指向數組。之所以使用指標指向數組是因為符號表示便利而且程式運行效率高。利用指向數組的指標編寫代碼可以佔用少量的記憶體更快的運行。進入正題,我們假定有一個int類型的數組value_array[100], 則int *array_ptr = value_array;
指標指向數組時指標的類型不代表數群組類型而是表示數組中包含元素的類型,雖然C語言數群組類型和所包含類型一直但是還是需要格外強調一下。再者就是指向數組其實是指向了該數組的第一個元素。其次就是數組不帶下標看作是指向該數組的指標並且是指向第一個元素的指標。即:
value_array = &value_array[0];
如果想要取到第i個元素就應該:
*(value_array + i - 1);
如果想要取到value_array[i]就應該:
*(value_array + i);請注意兩者的區別。
到此指標的主流內容已經結束,後續會更新函數的部分。請稍等~
C語言基礎——指標與函數