C語言之指標二

2021-08-15 16:41:49 字數 3244 閱讀 8460

函式指標

如果在程式定義了乙個函式,在編譯時,編譯系統為函式**分配一段儲存空間,這段儲存空間的起始位址,稱為這個函式的指標 

函式名就是函式開始的位址

函式二級指標可以修改函式指標的指向

函式指標,不僅僅是位址,必須明確函式指標型別和輸出引數型別和數量

函式名可以作為引數傳遞給函式指標

#include #include int add(int a, int b)

void print()

int main()

函式的返回值可以是指標

#include #include #include//函式,返回乙個位址,對於陣列而言,函式引數呼叫沒有副本機制

//函式返回值是乙個指標型別的函式

int* mindata(int a, int n) //查詢最小數

} printf("最小的值為%d\n",*p);

return p; //返回最小值的位址

}int main()

int *p = mindata(a,10); //獲取最小數的位址

//此時 直接修改*p 可以起到修改最小值 如,*p = 35;

printf("%d\n",p -a); //可以知道下標符號

system("pause");

}

左值,能放在賦值號左邊的值

int *const px;   //指標常量

寫乙個和strcpy函式功能相同的函式

#define _crt_secure_no_warnings

#include #include #include //寫乙個和strcpy函式功能相同的函式

char* mystrcpy(char* dest, char* source) //兩個引數目的 ,**

last = dest;//存入首位址

while ((*dest++ = *source++) != '\0');

//沒有遇到字元 '/0',一直拷貝資料

return last;

}int main()

; //char * p = mystrcpy(str, "你好明天\n"); //宣告乙個指標接受字串str的首位址

//printf("%p %p\n",str,p); 位址相同

//printf("%s", p);

//printf("位址為%p\n", strcpy(str, "你好明天\n"));//strcpy函式返回字串str的位址

printf("%s", strcpy(str, "山陰路的夏天\n")); //兩條語句的作用相同,函式沒有問題

printf("%s", mystrcpy(str, "你好明天\n")); //兩條語句的作用相同,函式沒有問題

system("pause");

}

指標包括 型別和位址,將位址轉換為指標,需要進行型別的轉換

如:int* p;

int x;

scanf("%x",&x);

p = (int*) x;

//將位址轉換為指標

void指標和空指標

void* 型別的指標,只包含位址不包含型別,是不指向任何型別的指標,任何型別都可以賦值給空型別指標,純位址的賦值,但指向不明確,大小不確定,無法取出內容,如果需要取讀位址的內容

應先對位址進行型別的轉換,一般用於引數還有返回值,不明確指標型別的情況傳遞位址,如  malloc() 函式的返回值

int* p =null;//不指向任何位址,即沒有初始化,空指標,*p等價於int型別,p等價於int*型別

void *p = malloc(20);

//分配20個位元組的記憶體,返回值賦值給void*型別指標變數p,可以轉換成任何型別的指標,malloc函式在stdlib.h標頭檔案中

int *px = (int*)p;    

//強制轉換指標型別,使分配的記憶體可以按照int型別解析

ferr(p);

//根據位址釋放指標,此時p為迷途指標

p = null;

動態記憶體分配

#define _crt_secure_no_warnings

#include#include//void* calloc(size_t num.size_t size)

//分配記憶體函式,第乙個引數為個數,第二個引數為記憶體大小,記憶體自動初始化為0

//void* realloc(void *ptr,size_t size)為以分配的記憶體重新分配空間並複製內容。

//引數一,已分配的記憶體位址,引數二重分配的位元組數 如果能拓展就拓展,不能就重新分配

int main()

free(p); //根據位址釋放記憶體,一定要記得釋放記憶體,除非空指標能反覆釋放

p = null;

//記憶體釋放之後,指標應該賦值為空,可以規避再次引用和反覆釋放的問題

//for (int i = 0; i < x; i++) //下標法

//        system("pause");

}

靜態記憶體分配由編譯器完成,如為乙個不大的陣列分配記憶體

動態記憶體分配

#define  _crt_secure_no_warnings

#include#includevoid detection(float* str)

}int mainaa()

return 也有副本機制,儲存在暫存器中,無法取位址  

一級指標作為函式返回值返回位址,一定不能返回指向棧的位址

#include#include //void swap(int* pa, int* pb)			//無法交換pa pb的值

//void swap(int* pa, int* pb) //可以交換pa pb的值

int main()

char *p = "你好,明天";

//指標儲存常量字串首位址,常量字串不能修改

一級指標75% 二級指標20%,** 四級指標.....n級指標 用於許可權管理???

沒有初始化的指標叫也指標

更高階指標可以改變低階指標的指向

指標宣告一定要初始化

#作用:加上雙引號

C語言之指標(二)

二 指標變數做函式引數 在使用函式時我們一般都使用的是基本型別做函式引數,如 int double float等等。那在使用指標變數做函式引數和基本型別做函式引數有什麼不同呢?1 在使用基本型別做函式引數時是把實參的值傳遞給形參,在被調函式中形參值的改變不能改變主函式中實參的值,如下 這個程式是想通...

C語言之指標

指標型別的本質分析 1 指標的本質 指標的本質 一種復合的資料型別。下面我將以下面幾個作為例子進行展開分析 a int p b int p c int parvalue 3 d int pfun 分析 所謂的資料型別就是具有某種資料特徵的東東,比如資料型別char,它的資料特徵就是它所佔據的記憶體為...

C語言之指標

指標的概念 什麼是指標?如果用一句話概括的的話那就是,乙個存放記憶體空間位址的變數。指標也是乙個變數,指標存放的內容是乙個位址,該位址指向乙個記憶體空間。指標變數的定義 int p 該變數用來存放乙個空間的位址。p 代表該指標指所指向記憶體空間中的值,切記指標只能存放有效的記憶體空間位址,不能存放其...