標籤:它的 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