c語言基礎學習07

來源:互聯網
上載者:User

標籤:它的   size   內容   class   例子   amp   技術   c語言   --   

=============================================================================
涉及到的知識點有:1、


=============================================================================
c語言是面向過程的語言,是弱類型語言,c語言的原始碼基本就是無數個函數的堆砌。
即很多函數就組成c語言原始碼了,也即它的原始碼基本就是函數構成的。

C語言裡面的test()和test(void)是不一樣的。什麼也不寫的話,C語言就比較含糊了,容易出錯,結果不可知。
C++語言裡面的test()和test(void)是一樣的。

c語言幾個鬆散的地方(不足的地方,不嚴禁的地方,它容易出錯的地方)。

課後思考:
寫一個函數求字串的長度。課後思考,用遞迴函式實現求字串長度。

=============================================================================
指標

指標是c語言裡面最抽象的、最重要的、最常用的。

指標的概念:

指標變數也是一個變數,
指標存放的內容是一個地址,該地址指向一塊記憶體空間,
指標是一種資料類型(指標類型)。
--------------------------------------
電腦記憶體的最小單位是什嗎?BYTE(位元組)

對於記憶體,每個BYTE(位元組)都有一個唯一不同的編號,這個編號就是記憶體位址。

作業系統就給記憶體的每一個位元組編了一個號,所以說:一個編號對應的是一個BYTE(位元組)的空間大小。

打比方:
1   ->   BYTE
2    ->   BYTE
3    ->   BYTE
4    ->   BYTE
    對應於
--------------------------------------
一個int多大?答:4個BYTE(位元組),所以一個int佔用了了4個編號(即4個不同的記憶體位址)。

地址的編號:在32位系統下是一個4個位元組的不帶正負號的整數;在64位系統下是一個8個位元組的不帶正負號的整數。
(因為地址不可能是負的,又因為無符號數可以表達一個更大的地址,有符號數表示的最大地址會變小)
-----------------------------------------------------------------------------
指標變數的定義:

可以定義一個指向一個變數的指標變數。
-----------------------------------------------------------------------------
取地址運算子 &

& 可以取得一個變數在記憶體當中的地址。(取地址取的是記憶體位址)

register int a;//寄存器變數,這種變數不在記憶體裡面,而在cpu裡面,所以是沒有地址的,
所以寄存器變數不能使用&來得到地址。
-----------------------------------------------------------------------------
無類型指標

定義一個指標變數,但不指定它指向具體哪種資料類型。可以通過強制轉化將 void * 轉化為其他類型指標,
也可以用 (void *) 將其他類型強制轉化為void類型指標。

void *p; 指標之間賦值需要類型相同,但任何類型的指標都可以賦值給 void * 。
-----------------------------------------------------------------------------

 1 linux下範例程式碼如下: 2  3 int main() 4 { 5     int *p; //定義了一個可以指向int類型地址的指標變數,指標變數的名字叫p。*不是變數名字的一部分。 6             //int * 是一種資料類型。 7     int a;  //定義了一個int類型的變數,int變數的名字叫a。 8  9     a = 1;  //int * 和 int是兩種不同的資料類型。10     p = &a; //把a的記憶體位址賦值給p。11 12     printf("%p\n", p);  //0x7fff5b2faedc 輸出的是a的首地址的編號,不會把四個編號都輸出的。13                         //而且注意:每一次執行該代碼後,輸出的編號都會發生變化!14 15     *p = 10;    //通過指標變數間接的訪問a的值,*p代表指標指向變數的值,p代表指向變數的地址。16     printf("a = %d\n", a);  //a = 10; 通過上面的方法把a的值改變了。17 18     a = 100;19     printf("%d\n", *p); //100   通過指標變數間接的訪問a的值。20 21     int b = 2;22     p = &b; //又把b的記憶體位址賦值給p。23     *p = 20;24     printf("b = %d\n", b);  //2025 26     //char *p1 = &a;  //相當於 char *p1; p1 = &a;//兩個類型不相同的地址。即指標類型不相容。那麼我們強轉試試!27     char *p1 = (char *)&a;28     a = 123456;29     *p1 = 0;30     printf("a = %d\n", a);  //a = 123392  就算強轉後也會出現問題,所以要避免指標類型不相容問題。31 32     void *p2;   //可以指向任何類型的地址,void代表無類型。33 34     return 0;35 }

 linux下代碼如下:

-----------------------------------------------------------------------------

指標佔用記憶體的說明

在同一個系統下,不管指標指向什麼樣類型的變數,地址的大小(或叫編號的大小)總是一樣的。

 1 linux下範例程式碼如下: 2  3 int main() 4 { 5     char *p1; 6     int *p2; 7     long long *p3; 8  9     printf("%lu, %lu, %lu\n", sizeof(p1), sizeof(p2), sizeof(p3));  //實質是:編號的大小是多少?10     return 0;   //輸出的是 8, 8, 811                 //地址的編號:在32位系統下是一個4個位元組的不帶正負號的整數;在64位系統下是一個8個位元組的不帶正負號的整數。12                 //指標變數的名字叫p1、p2、p3。指標變數的大小是多大呢?因為指標變數對應的是某某的首地址的編號,13                 //即指標變數對應的是編號,而編號就是記憶體位址。即編號在64位系統下是一個8個位元組的不帶正負號的整數。14                 //所以指標變數的大小就是編號的大小,而編號在64位系統下用8個位元組的不帶正負號的整數表示。15                 //舉例子說明下:同一個酒店,房間的編號的長度都是一樣的。16 17 }

 linux下代碼如下:

 

c語言基礎學習07

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.