1:*與&的區別:&表示的是某個數的位址,*表示的是取某個指標裡面的值,列:int a = 1;int *p = &a;表示的是定乙個整型變數a = 1,然後把a的位址給了p,此時p的指標指向a的位址,則p表示的值也為1
3:指標當中malloc的作用:
malloc就是memory allocate動態分配記憶體,malloc的出現時為了彌補靜態記憶體分配的缺點,靜態分配記憶體有如下缺點:
1、比如說,傳統的一維陣列,如int a[5],使用傳統的一維陣列需要事先指定陣列的長度,而且陣列的長度必須是乙個常量(巨集定義的 常量)
2、傳統陣列(靜態分配),不能手動釋放,只能等待系統釋放,靜態分配的變數在該函式內執行的時候有效,當靜態分配的變數所在函式執行完之後,該記憶體會自動釋放。靜態分配的記憶體,是在棧中分配的,其實在c語言中的函式呼叫也是通過棧來實現的,棧這種資料結構的乙個特點就是(先進後出),所以,在呼叫函式的時候,都是先壓入棧中,然後,再從最上面的函式開始執行,最後,執行到main函式結束。動態分配通過malloc分配,是在堆中分配的,堆不是一種資料結構,它是一種排序方式,堆排序。
3、傳統陣列的長度一旦定義之後,就不能更改,比如說,如果我有乙個業務在這之前給分配的大小為100,但是,我現在由於業務數量的增長,原來的大小就無法滿足。
4、靜態分配不能跨函式呼叫,就是無法在另乙個函式中,來管理乙個函式中的記憶體。靜態分配,只在當前函式有效,當,靜態分配所在的函式執行完之後,該變數就不能被其他的函式所呼叫。
4:malloc的用法:使用malloc時必須有標頭檔案《malloc.h》,列:int *p = (int *)malloc(sizeof(int)。int *p表示的是乙個為整型變數的指標p,int*表示將maoolc的viod*強制轉換為int*型別,sizeof(int)表示為這個指標分配多少空間數
5:指標變數輸出加*和不加*的區別:不加*輸出的是定義的變數型別的位址,加*表示輸出的是位址裡面的值
6:指標定義的常見錯誤:int a = 1,*p;*p = a;(錯誤),不能對未賦值的指標作(指向運算)
7:陣列與指標的區別:陣列: 乙個陣列就是乙個位址,並且該位址是乙個常量值,不能改變。因此,陣列名不能作為左值。
指標: 乙個指標就是乙個位址的位址 , 並且該位址是可以改變的。也就可以作為左值。
8:指標與位址的區別:指標就是位址,但位址不是指標。指標有型別,位址沒有型別
9:函式呼叫指標:1、如果在被調函式中想修改主調函式中變數的值,則需要將主調函式中的變數的位址(指標)傳遞到被調函式中
2、如果主調函式要傳遞乙個超大的資料到被調函式中時,也可以將主調函式的變數的位址(指標)傳遞到被調函式中,這樣有利於提高程式的效能
3、傳遞n級指標是為了修改n-1級指標的值,
10:變數的型別:1、資料型別的本質是固定記憶體空間大小的別名
2、變數的本質是一段連續記憶體空間起始位址的別名
c語言指標問題
c是一門可以直接操作記憶體的語言,但這並不代表我們就可以以自己主觀的意思來操作記憶體。看下面的 includevoid pr int p,int p1 int main void pr int p,int p1 執行後結果都是12.首先,我們要明白指標的定義是乙個存放位址的變數,也就是說,它指向的位...
c語言指標問題
對於以下 段 int a int p a int q a 5 printf d q p 當sizeof int 為4時,以下說法正確的是 a.因為第三行的錯誤不能編譯 b.因為第三行的錯誤執行時崩潰 c.輸出5 d.輸出20 指標的減法實際是位址間能存放多少個指標指向物件的資料型別的值。a是int型...
學習C語言指標
先看個程式,是華為2005年招聘筆試題之一 include main int p,q p a q a 2 printf a p q d n q d n p d n q p d n a q p q,p,q p getch 執行結果 a q p 3 q 42 p 46 q p 2 6.3 指標的運算 指...