C語言 第六章

2021-06-26 03:08:40 字數 4852 閱讀 6743

c語言——第六章 - 飄過的小牛 - 部落格頻道 - csdn.net

一.變數儲存空間的分類順序

先宣告的變數後分配儲存空間;撤銷的順序與之相反:先建立的後撤銷。這種機制就稱為棧機制,好像往乙個只能允許進出乙個盤子的桶裡放盤子,先放進的後拿出。在c

語言程式中,區域性變數就被分配在棧區,而且是以高階為棧底建立的。所以後建變數的位址較小。

每個變數只有乙個位址,但占用的空間不同

二.乙個指標所指連變數的型別,稱為該指標的基型別。

三.指向void

型別的指標

void *p;

這表示指標變數不指向某一確定型別的資料。它的作用僅僅是用來存放乙個位址,而不能指向非

void

型別的變數。例如,下面的寫法是錯誤的。

int *p1;

void *p2;

int i;

p2 = &i;

printf("%d", *p2);

如果確實需要將&i

的值放在

p2中,應先進行強制型別轉換,使之成為

(void *)

型別,再將

p2賦值給

p1時,同樣應進行強制型別轉換。

p2 = (void *)&i;

p1 = (int *)p2;

printf("%d", *p1);

注意:執行p1=(int *)p2

之後,p2

本身的型別並未改變。只是在向

p1賦值前先進行強制型別轉換,生成乙個

(int *)

型別的臨時資料賦值給p1

四.#include

int main()

, i, *p;

printf("下標法:

");

for(i = 0; i < 5; ++i)

printf("%d,", a[i]);

printf("\n陣列名法:

");

for(i = 0; i < 5; ++i)

printf("%d,", *(a + i));

printf("\n指標變數法:

");

for(p = a; p < a + 5; ++p)

printf("%d,", *p);

printf("\n");

return 0;

}雖然上面三種方法都能輸出同樣的結果,但它們的執行效率是不同的。用下標法訪問陣列元素時,是把a[i]

轉換成*(a+i)

進行計算的,即先計算出陣列元素的位址

(a+i)

,然後再

找到它所指的儲存單元,讀出或寫入它的值。而用指標變數

p指向陣列元素時則不必每次都計算陣列元素位址。特別是使用

p++這樣的操作是速度比較快的。

五.char str[m][n];

char *str[n];

char **str;

1.char str[m][n],在這個宣告中,有兩個相同的陣列型別說明符

,按照從左到右的結核性,額可以首先確定

str是乙個大小為

m的向量(一維陣列)。對於陣列,自然要說明其型別,由

char

和[n]

補充說明,這個陣列是長度為

n的字元陣列型別,即它的每個元素都是長度為

n的字元陣列。用這種方式儲存的幾個字串占有連續的儲存空間。

2.char *str[n],在這個宣告中,有兩個不同的陣列型別生命符

和*。其中陣列型別生命符的優先級別高,可首先確定

str是乙個大小為

n的一維陣列。餘下的

char和*

補充說明:這個陣列的每個元素都是字元型別指標。採用這種方式儲存的幾個字串的長度可以不同,不一定占有連續的儲存空間。

3.char **str,在這個宣告中,有兩個相同的型別生命符

*。按照自右向左的結合性,可以首先將後面的乙個

*與名字相結合,得出結論:

str是乙個指標。對於指標,就要宣告它指向什麼。由餘下的

char和*

補充宣告,這個指標是指向字元指標的。

用二維字元陣列儲存,需要按照最長字串開闢儲存空間,而用字串陣列(即字元指標陣列)儲存時,可以為不同長度的字串開闢不同長度的儲存空間。採用字串陣列來儲存字串不進可以節省空間,還可以提高執行效率。例如,對儲存的字串進行交換,如果是二維陣列儲存,必須實際交換所儲存的字串,而採用字元指標陣列則只需要交換兩指標變數的值,不需要實際移動字串。

六.p212頁

全域性變數是在編譯時在記憶體靜態儲存區分配的,非靜態的區域性變數是程式執行是在棧區自動分配的,而為指標所進行的記憶體空間動態分配是在程式執行過程中在自由記憶體區——堆(heap

)區分配的。堆可以形成比較大的儲存空間,供動態分配使用。

動態分配的特點是,可以由程式設計師控制,在需要時分配,在不需要時釋放,還可以根據具體需要改變所分配儲存空間的大小。

以下四個函式包含在stdlib.h中。

1、malloc

函式,其函式原型為:

void * malloc(unsigned int size)

其作用是在記憶體的動態儲存區中分配乙個長度為size

的連續空間,函式的返回值是所分配區域的第乙個位元組的位址。

2、calloc

函式,其函式原型為:

void * calloc(unsigned n,unsigned size)

其作用是在記憶體的動態儲存區中分配n

個長度為

size

的連續空間,一般用來儲存乙個陣列(

n為陣列元素的個數,每個陣列元素長度為

size

,這就是動態陣列),函式返回指向所分配域的起始位置的指標。如果分配不成功,返回

null。

3、free

函式,其原型為:

void free(void * pointer)

其作用是釋放指標變數p

所指向的動態空間,使這部分空間能重新被其他變數使用。

pointer

應是最近一次呼叫

calloc

或malloc

函式所得到的函式返回值。

free

函式沒有返回值。

4、realloc

函式,其原型為:

void * realloc(void * pointer,unsigned int size)

對已使用malloc

函式或calloc

函式獲得的動態空間進行重新分配。如果重新分配不成功,返回

null

說明:1.因為

void *p說明p

是void*

型別的指標,宣告其型別是未確定的型別,可以通過強制轉換的方法將其轉換為任何其他型別。例如

double *pd=null;

pd = (double *)calloc(10,sizeof(double));

並且通過(double*)

對calloc()

的返回型別進行強制型別轉換,以便把

double

型別資料的位址賦值給指標

pd 

2.使用sizeof

的母的是用來計算一種型別所占有的位元組數,以便適合不同的編譯器。

3.由於動態分配不一定成功,為此要附加一段異常處理程式,不致程式執行停止

if(p == null)

七.其實main

函式也可以有引數。有引數的

main

函式的原型為

int main(int argc, char *argv);

也就是說,帶引數main

函式的第乙個形參

argc

是乙個整型變數,第二個形參

argv

是乙個指標陣列,其每個元素都指向字元型資料(即乙個字串)。

這兩個引數的值從**傳遞而來呢?main

函式是主函式,它不能被程式中的其他函式呼叫,因此顯然不可能從其他函式向它傳遞所需要的引數值,只能從程式以外傳遞而來。也就是在啟動乙個程式時,從程式的命令列中給出。

八.main()

這段程式看起來沒錯,但是仔細一看,或者一執行就會發現有錯誤。因為a++

的使用而導致了這種情況的發生。因為

a代表陣列的起始位址,是乙個常量。而常量是不能進行自加運算的。所以

a++是錯誤的。如果

a只是乙個函式裡面的形參,那麼就可以作為乙個指標變數就可以進行自加運算了。

九.利用指標實現各種函式,如:strcpy, strlen, stringcat, stringchr, delchar

等。。 十.

乙個函式包括一系列指令,在記憶體中佔據一片儲存單元,它有乙個起始位址,即函式的入口位址,通過這個位址可以找到該函式。也可以定義乙個指標變數,使它的值等於函式的入口位址,通過這個指標變數也能呼叫此函式,這個指標變數稱為指向函式的指標變數。例如:

int (*p)();表示

p指向乙個「返回正興致的函式」。注意

*p兩側的括號不能省略,如果寫成「

int *p()

」就變成「返回指標值的函式」了。

可以用指向函式的指標變數作為被呼叫函式的實參。由於該指標變數是指向某一函式的,因此先後使指標變數指向不同的函式,就可以在被調函式中呼叫不同的函式。

十一.有人可能會認為,實現不同的功能時直接呼叫不同的函式即可,例如在main

函式中直接呼叫幾個函式即可,何必通過乙個函式借助傳遞函式位址的方式實現呢?的確,如果程式功能很簡單,可以不通過這種方法。但是在一些較為複雜的問題中,以函式位址作為引數的優越性就比較明顯了。。。比如求乙個函式的定積分。顯然,如果不採用這種方法,而分別編寫求解某函式定積分的函式,將是十分麻煩的。

一位acmer過來人的經驗

c語言——第七章頂

0 踩

C語言例題第六章

例6.1對十個陣列元素依此賦值為0,1,2,3,4,5,6,7,8,9,要求按逆序輸出。例6.2用陣列處理求fibonacci數列問題。例6.3有10個地區的面積,要求對它們按由小到大的順序排列。include intmain printf the sorted numbers n for i 0 ...

C語言第六章 指標

一,什麼是指標 2.其次要了解計算機的cpu和記憶體條之間的關係 3.指標的含義 二,指標的定義 1.指標變數的基本定義 includeint main void 2.指標變數的解釋 3.經典的指標程式 互換兩個變數的值 includevoid fun int p,int q int main vo...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...