c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)
C語言指針讓一切想法變成可能,強轉和指針可以看做一項呼風喚雨的利器,但是C語言中指針應用又需要格外的小心,其更靈活的利用內存,因為不當的應用可能引起各種異常,這篇文章就是讓我們一起來認識C指針,更好的利用C指針!
指針變量的定義初始化和解引用
內存如何編址?
內存中的每個字節都有唯一的編號(地址),內存地址按字節編號,其字長一般與主機相同,32位機器使用32位地址,最多支持2^32字節內存(4G)
地址是一個無符號整數,從0開始依次遞增,通常地址寫成16進制。
如何對變量進行尋址?
直接尋址
直接到變量名標示的存儲單元中讀取變量的值
scanf("%d", &a);//假如忘記寫&符號,a的值被當成地址。比如a為100,則會覆蓋內存中地址為100位置的值。
printf("a=%d\n",a);
間接尋址
通過其他變量間接地找到變量地址讀取變量的值
用什么類型來存儲地址? 指針Pointer類型
指針變量
具有指針類型的變量
保存32位地址值 sizeof(pa)是4個字節
用什么數據類型去理解他所指向的存儲單元中的數據呢?
int *pa; int *pa = &a
int 指針變量指向的數據類型 稱為基類型
指針變量的內容 &a
指針變量pa是變量a的指針
如何顯示變量的地址
使用%p格式符
變量指針只能指向同一基類型的變量
使用未初始化的指針會怎樣?
指針變量使用之前必須初始化
若不知指向哪里 那就指向NULL(stdio.h中 定義為0)
NULL是什么
空指針-值為NULL的指針 即無效指針
問題:p=0和p=NULL有什么區別
A:*p=NULL可以明確的說明p是指針變量,而不是數值型變量
問題:空指針就是指向地址為0的存儲單元的指針對么?
A:不一定,并非所有編譯器都是用0地址,某些編譯器為空指針適用不存在的內存地址
如何訪問指針變量指向的存儲單元中的數據
通過間接尋址運算符訪問(引用)指針變量指向的變量的值
指針的解引用(Pointer Dereference)
*pa
指針變量的定義和初始化
正確方式
int *pa,*pb;
錯誤方式
int *pa,pb;
需要嚴格注意區分
指針變量作為函數參數
指針變量的解引用如何理解
間接尋址運算符 此* 非彼*
只要pa指向a,*pa就是a的別名
指針變量做參數有何優勢
基本類型的變量做函數參數
Call By Value Passing arguments by value
實參變量的值->形參(parameter)
在被函數中不能改變實參的值
指針類型的變量做函數參數
Simulating Call by reference- Passing arguments by reference
是參變量的地址->指針形參(pointer parameter)
在被調函數中可以改變實參的值
Call by value
#include
void Fun(int par);
int main()
{
int arg = 1 ;
printf("arg = %d\n", arg);
Fun(arg);
printf("arg = %d\n", arg);
return 0;
}
void Fun(int par)
{
printf("par = %d\n", par);
par = 2;
return 0;
}
Call by reference
#include
void Fun(int *par);
int main()
{
int arg = 1 ;
printf("arg = %d\n", arg);
Fun(&arg);
printf("arg = %d\n", arg);
return 0;
}
void Fun(int *par)
{
printf("par = %d\n", *par);
*par = 2;
return 0;
}
指針變量作形參為函數
提供了修改實參值的手段
實戰:兩數交換
方案一:使用指針變量
需要注意
* 要傳遞地址給指針
* 實參形參數據類型要一致
* temp為整形 這里不要寫錯為指針類型
int main()
{
int a = 5, b = 9;
Swap(&a, &b);
printf("a=%d,b=%d",a,b);
return 0;
}
void Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
方案二:通過數組
數組這里也是傳引用
int main()
{
int a[2] = {5, 9};
Swap(a);
printf("%d,%d", a[0],
a[1]);
return 0;
}
void Swap(int p[])
{
int temp;
temp = p[0];
p[0] = p[1];
p[1] = temp;
}
想了解更多其他技術博文,后續更多文章可以在Montage GTD來訂閱RSS啦
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高考多少分能上石家庄工程职业学院(202
- 下一篇: c语言如何使四种运算符同级,二 如何学习