函式指標
如果在程式定義了乙個函式,在編譯時,編譯系統為函式**分配一段儲存空間,這段儲存空間的起始位址,稱為這個函式的指標
函式名就是函式開始的位址
函式二級指標可以修改函式指標的指向
函式指標,不僅僅是位址,必須明確函式指標型別和輸出引數型別和數量
函式名可以作為引數傳遞給函式指標
#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 代表該指標指所指向記憶體空間中的值,切記指標只能存放有效的記憶體空間位址,不能存放其...