注:關於陣列名的乙個通常兩個例外
char arr[10];
1: arr 通常情況表示首元素的位址
2: &arr 表示整個陣列的位址
sizeof(arr) 整個陣列占用記憶體空間大小
基位址 變數的位址值
位址包括兩個方面的內容
乙個叫物件大小 乙個是基位址(32位或者64位)
指標:
用來儲存位址的變數 指標變數簡稱指標
變數就要有型別, 指標變數是型別帶*
int a; 定義乙個int型別的變數a
char b; 定義乙個char型別的變數b
int * a ; 定義乙個int指標型別的變數a
char * b; 定義乙個char指標型別的變數b
32位機 32根位址線 每個位址值都是由32位組成 4b
乙個位址只能放乙個位元組
指標型別是表示該位址對應的物件是什麼資料型別
指標變數的值是某個基位址
指標定義 *表示是個指標型別變數
一級指標
資料型別 * 變數名
二級指標
變數中存的是乙個一級指標變數的位址
資料型別 ** 變數名
int * q;
char *p;
float * x;
void * qt ; 注意沒有void a 這種寫法,因為void沒有大小
qt定義為乙個通用指標,只有基位址沒有物件大小
一般只做傳參, 但是在使用之前必須先強制型別轉換成已知型別
指標的初始化和賦值
int a;
int * q = &a; // 直接使用變數a的位址給指標變數q賦值
等同於 int * q ;
q = &a;
在賦值過程中不能直接使用常量給乙個指標賦值
int *q = 0xbfffc000;不允許,因為記憶體分配是系統決定,執行時候不知道準確的位址值
int *q = null ; null是唯一乙個可以給指標賦值的常量
給乙個指標變數賦值,要求列印該指標變數的值,和該指標變數所在的位址
%p指標的解引用
int a = 100;
int *q = &a;
q ==== &a;
*q 是通過q的值來得到對應位址中存的值
也就是通過&a來得到對應位址中的值, 也就是a的值
*q = 100; 把100放進指標變數q對應的位址中
有兩int型別變數a, b
通過兩個指標把a 和b值進行交換
int a = 100;
int b = 200;
int *p = &a , *q = &b ; 等價於int *p ; int *q;
int temp;
temp = *p; //100
*p = q ; // a的值更改q 也就是200
*q = temp ;// 100
%d %d a , b
%d %d *p , *q
指標的運算(以物件為單位)
q + 1
q ++ q 值會變
q - 2
q –q - p q和p 是同型別指標,實際得到的是相隔物件的個數
指標和陣列的關係
int arr[5];
arr[ 1 ]==> *( arr + 1) ==> *( &arr[0] + 1) ==> *(&arr[1])
p[-1] ==> *( p -1 ) ==> -1 [ p ]
如果 int arr[5]= ;
int * p = arr; // *p ==== arr ng這個是錯誤的理解 p ==== arr 對
max = *p; // arr[0] *arr
for(i=1 ; i<5 ; i++)
}1: 如果定義了乙個陣列int arr[5], 並設定了指標等於陣列名 int *p = arr
那麼在操作的時候 p 和arr是可以混用的
arr[i] p[i]
*(p+i) *(arr+i)
2: 使用字串直接給指標賦值 和 使用字元陣列名給指標賦值 有差異
char str[10] = 「hello」;
char *p = str;// 用陣列str的首元素位址給p賦值
char *q = 「hello」;// 使用唯讀資料段中的"hello"的首元素位址給取q賦值
可以通過*p 修改字元陣列的值,
但是不能通過 *q修改唯讀資料段的值,該值是在編譯時候就已經確定的
3: 指標賦值
int *q = null;
q = 100 有風險, 訪問位址100涉嫌訪問非法空間
指標解引用後賦值
q 在q操作之前要先判斷q的值不為null
if(q !=null)
*q = 100;
4; 陣列名在傳參的時候,實際傳的是首元素位址
函式的形參應該為同型別的指標變數
如果在函式中需要知道該陣列的元素個數, 則需要再傳乙個引數告訴函式
函式的定義 宣告 和呼叫
定義函式的返回值型別 函式名(函式的形參)
定義乙個函式, 傳入的引數是兩個int型別變數a b , 返回值是int
int func ( int a, int b)
定義乙個函式, 傳入的引數是乙個int型別變數a 乙個字元指標變數 , 沒有返回值
void func (int a , char * p)
定義乙個函式, 沒有傳入引數, 返回值是個char
char func (void )
; // 非形參
sizeof(arr) 表示整個陣列的大小,44b ; 例外情況之一
int result = sum( arr , sizeof(arr)/sizeof(arr[0]) );表示乙個元素所占用的空間,int型別元素,4b
printf(「result = %d \n」, result);
strtoull
輸入aabb , 16 返回數值 43707
1010 , 8 返回數值 520
1 9 a b c d e f …
, 16
ptr == null
digit = *ptr - 『0』;
digit = *ptr - 『a』 + 10
digit = *ptr - 『a』 + 10
ret *= base;
1aa 16
digit = 1; ret = 016 +1
digit = 10; ret = 116+10
digit = 10; ret = 26*16 + 10
c語言基礎(五)
型別名 int 10 變數名 arr int arr 10 表示包含十個int型別元素的陣列。定義陣列的時候,陣列的大小就確定了 完全初始化 int arr s 陣列沒有制定大小,編譯器預設後面的初始化是完全初始化 在陣列中,有 則初始化,另外上式中5後邊的,不影響 s這個數規定陣列大小,當然也可以...
C語言基礎篇 五
include include struct student 結構體定義一 typedef struct 結構體定義二 newstudent int main int argc,const char argv 注意 結構體定義,在花括號後面加分號 結構體變數初始化 struct 結構體名 變數名 s...
C語言基礎五 函式
什麼是函式?函式是封裝起來能實現一定功能的 寫在文中不易體現函式特點,最下方附完整 1.函式定義 需要在主函式之前定義 型別名 函式名 引數 型別名決定函式返回值的資料型別 void型函式不返回值 引數不是必要的,可沒有引數 2.實參與形參 概念 主調函式 呼叫函式的函式 被調函式 被函式呼叫的函式...