C語言回顧10 04 19

2021-09-19 07:45:23 字數 1441 閱讀 3231

理解之後怎的第一步是在機器級上觀察指標表示的內容,大多數現代計算機都將記憶體分割為位元組,每個位元組可以儲存8位 的資訊。01

0100

11每個位元組都有唯一的位址,用來和記憶體中其他位元組相區別。如果記憶體中有n個位元組,那麼可以把位址看做0-n-1的數。

位址記憶體

001010011

101110101

201110011

301100001

401101110

......

這就是指標的出處,雖然用數表示位址,但是位址的取值範圍可能不同於整數的範圍,所以一定不能用普通整形變數儲存位址,但是我可以用特殊的指標變數儲存位址。當指標p儲存i的位址時,我們說p」指向「i,換句話說,指標就是位址,而指標變數就是儲存位址的變數,他也是一種資料型別

現在,我們來看看指標變數的宣告。指標變數的宣告與其他普通變數的宣告基本一樣,唯一的不同就是必須在指標變數名字前放置星號*。

例如:int i,a[10], *p,*q;

i和j都是整形變數,p,q就是指向整形物件的指標,c語言要求每個指標變數只能指向一特定型別的物件

為使用指標,c語言提供了一中特殊設計的運算子。為了找到變數的位址,可以使用&,比如變數i,&i就是i在記憶體中的位址。為了獲取指標物件,可以使用*運算子。如果p是指標,那麼*p表示p當前指向的物件。

當我們定*p&i時,*p就是i的別名,不僅擁有和i一樣值,而且對*p的修改,也會改變i的值。

那麼之前,形式引數是不能改變實際引數的,如果我們把指標當成引數是不是就可以改變呢?我們程式設計實踐一下:

#includevoid  change1(int *p)//用指標修改*p的值

void change2(int n)//普通改變n的值

int main()

我們編寫了這樣乙個程式,大家可以猜猜看兩次列印分別是什麼值。那麼實際列印效果是這樣的:可以看出來,第乙個change函式改變了n的值,第二個並沒有。這是因為,第乙個傳入的是n的位址並賦值給p,通過*p可以直接在記憶體裡找到i的位置,然後改變是可以影響到原來的i的值的。而第二個是形式引數,他會重新開闢一塊記憶體保留引數,並不會影響原來的實際引數。

我們不僅可以為函式傳遞指標,還可以編寫返回指標的函式。返回指標的函式是相對普遍的,當給定指向兩個整數的位址中,下列函式返回指向兩個函式中較大數的指標。

int *max(int *a,int *b)

但是在這我們需要注意,不能返回區域性變數的位址,因為一旦函式返回,區域性變數就會不存在了,所以指向區域性變數的指標都是無效的。在有些時候,我們不想指標變數的值改變或者其他值改變,可以在定義的時候加上const,比如const int *p,那麼p的值不會發生改變,在程式請求改變p的值的時候,會發生錯誤提醒。這個指標就被稱為常量指標,

另外,還有一些指標和陣列,指標和函式,指向指標的複雜內容,下次再做介紹。

17 : 35

C語言回顧

1.資料型別對應的位元組數 資料型別 位元組數 unsignd char 1 short int 2 int 4 long int 4 long long int 8 float 4 double 8 long double 12 2.讀取資料格式指定符 short hd int d float f...

c語言回顧

1.資料型別及其範圍 int 10位 2147483648 2147483647 d 4個位元組 long和int都是4位元組,範圍也是一樣,但scanf時候,long是 ld long long是8位元組,輸入 lld,範圍很大,大概是 9 10 18 9 10 18 float是 f,4位元組,...

C語言基礎回顧

這節課講的特別基礎,複習了大概的基本標示符,資料型別,常變數的特性,還有程式的基本結構 於是下面是課後習題 打漁曬網 中國有句俗語叫 三天打魚兩天曬網 某人從1990年1月1日起開始 三天打魚兩天曬網 問這個人在以後的某一天中是 打魚 還是 曬網 include int count day int ...