帶你分分鐘玩轉(zhuǎn)C語(yǔ)言指針
何為指針
指針這玩意說白了,就是用來存儲(chǔ)一個(gè)變量地址的東東 如圖:

(編輯器為vc2010)
#include<stdio.h>
void main(){
int a,*p;
a=5;
p=&a;
printf("a=%d,p=%p,*p=",a,p,*p);
getchar();
}所以通過剛剛的情況,我們發(fā)現(xiàn)通過指針我們不僅可以獲取一個(gè)變量的值還可以直接對(duì)變量的值修改
又如下面的例子:
#include<stdio.h>
void main(){
int a=3;
int* prt;
prt=&a;
printf("a的值為%d\na的地址為%p\nprt存放的值為%p\nprt的內(nèi)存地址為%p\nprt所存的地址對(duì)應(yīng)的值為%d",a,&a,prt,&prt,*prt);
getchar();
}數(shù)組指針
說到指針只說基本的int char float有什么意思,接下來是一個(gè)數(shù)組指針 將數(shù)組和指針結(jié)合起來.當(dāng)然數(shù)組本身在傳遞的時(shí)候就是以指針傳遞的. 下面是以段代碼演示
#include<stdio.h>
void main(){
int a [5]={1,2,3,4,5},*p,i;
p = a;
for(i=0;i<5;i++){
printf("&a[%d]=%p,a[%d]=%d\n",i,p,i,p[i]);
}
getchar();
}
我們發(fā)現(xiàn)當(dāng)p=a(指針指向數(shù)組a)后,指針p可以和數(shù)組a一樣操作,這就是指針數(shù)組.
指針數(shù)組
既然說到了指針數(shù)組那么就不得不說數(shù)組指針,乍一看這兩個(gè)名字很像,其實(shí)差距還是很大的. int *p[] 下面還是以上面的例子為例,我們讓輸出結(jié)果一致
#include<stdio.h>
void main(){
int a [5]={1,2,3,4,5},*p[5],i;
for(i=0;i<5;i++){
p[i]=&a[i];
}
for(i=0;i<5;i++){
printf("&a[%d]=%p,a[%d]=%d\n",i,p[i],i,*p[i]);
}
getchar();
}我們發(fā)現(xiàn),這個(gè)東東其實(shí)就是一個(gè)存儲(chǔ)地址的數(shù)組,這個(gè)內(nèi)存地址既可以是int char 或者float 同時(shí)也可以是數(shù)組,這個(gè)我們?cè)谡f完字符串?dāng)?shù)組后再說.
字符串?dāng)?shù)組
C語(yǔ)言里面沒有string類(java)也沒有str(python)只有字符,所以我們引入了字符串?dāng)?shù)組,用來存儲(chǔ)字符串. ('a' 一個(gè)字節(jié) "a"兩個(gè)字節(jié)) 這里要注意一下的是,一個(gè)字符串?dāng)?shù)組如 char a[5]="hello",表面上看這里只有五個(gè)字符,但是其實(shí)在他們的內(nèi)存分布里面最后面結(jié)尾('o'后面)還有一個(gè)字符'\0'表示結(jié)束,所以只用char a[5]放不下hello,char a[6]="hello"才行.所以"a" 是'a'+'\0'兩個(gè)字節(jié)('\0'不顯示)
#include<stdio.h>
void main()
{
char a[6]={'h','e','l','l','o'};
//char a[6] ="hello";也行
printf("%s",a);
getchar();
}此外還要注意一點(diǎn)直接寫一個(gè)"hello"也是一個(gè)字符串?dāng)?shù)組只不過未命名罷了,我們可以用指針訪問
#include<stdio.h>
void main()
{
char *p="hello";
printf("%s\n",p); //%s 會(huì)讀取第一個(gè)字符的地址知道讀到'\0'
printf("%c",p[1]);//輸出字母e
getchar();
}數(shù)組指針的sao氣操作
先看一段代碼
#include<stdio.h>
void main(){
char *p[3]={
"hello",
"my",
"friend"
};
printf("%s",p[1]);
getchar();
}
現(xiàn)在我們發(fā)現(xiàn)p[1]可以和一個(gè)字符指針一樣操作,也就是說 p[1]等價(jià)于
char a[4]="my",*c; c=a; 這里的c就等價(jià)于p[1]
#include<stdio.h>
void main(){
char *p[3]={
"hello",
"my",
"friend"
};
int i;
for(i=0;i<2;i++)
{
printf("%c\n",p[1][i]);
}
getchar();
}
二級(jí)指針
這個(gè)家伙,就是套娃,看一張圖就明白了

函數(shù)指針
int (*p)( int x) int 指向的函數(shù)類型 (*p)指針名字 (int x) 所指向的函數(shù)所需要輸入的參數(shù)
這個(gè)呢就是一個(gè)函數(shù) 舉個(gè)例子
#include<stdio.h>
void main(){
int go(int x);
int x,(*p)(int x);
scanf("%d",&x);
p=go;//指針指向函數(shù)
//(*p)(x)也行
p(x);
getchar();
getchar();
}
int go(int x)
{
printf("you input number is:%d",x);
}這玩意的好處是啥呢, 有了這玩意,我可以直接向一個(gè)函數(shù)里面?zhèn)鬟f另一個(gè)函數(shù) 舉例升級(jí)
#include<stdio.h>
void main(){
int go(int x),x;
void show(int x, int(*p)(int x));
scanf("%d",&x);
show(x,go);
getchar();
getchar();
}
int go(int x)
{
printf("you input number is:%d",x);
}
void show(int x, int(*p)(int x)){
printf("you have inputed!\n");
p(x);
}
指針函數(shù)
說白了這就是一個(gè)函數(shù),返回了一個(gè)地址如:
int* go (int* x,int* y)
和函數(shù)指針長(zhǎng)得像,原因在于* 得運(yùn)算級(jí)別比()低所以函數(shù)指針加了() 舉個(gè)例子
#include<stdio.h>
void main(){
int *go(int *x);
int a=5,*p;
p=go(&a);
printf("a的地址為:%p,值為:%d",p,*p);
getchar();
}
int *go(int *x){
printf("地址以獲取\n");
return x;
}
文件指針
這個(gè)就有意思了,C語(yǔ)言把所有的設(shè)備都視為指針. FILE *fp=NULL; fp = fopen("文件路徑","w") ("w"是打開模式,w寫) fprintf(fb,"%s",str) 這玩意和print的用法是一樣的只不過前面指明了指針 換句話說 printf("hello) 與 fprintf(stdout,"hello")一樣,stdout屏幕指針,stdin鍵盤指針 同理 fputs("hello",fp)
接下來是讀文件 char s[100] fp = fopen("文件路徑","r")
fscanf(fp,"%s",s) fgets(s,100,fp) (100是最大長(zhǎng)度) 區(qū)別是什么呢,fprintf()讀到空格或回車就返回,fgets()讀到回車返回 此外還要fread() fread(接收數(shù)據(jù)的地址,讀取多少字節(jié)的內(nèi)容,數(shù)據(jù)項(xiàng)個(gè)數(shù),文件指針) 其他的查手冊(cè)就好 最后別忘了關(guān)閉 fclose(fp)
總結(jié)
到此這篇關(guān)于C語(yǔ)言指針的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框的示例代碼
可擴(kuò)展對(duì)話框通常用于用戶對(duì)界面有不同要求的場(chǎng)合。當(dāng)供高級(jí)用戶使用或需要更多信息時(shí),可通過某種方式的切換顯示完整對(duì)話窗體(擴(kuò)展窗體)。本文將用Qt實(shí)現(xiàn)可擴(kuò)展對(duì)話框,需要的可以參考一下2022-06-06
詳解利用C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長(zhǎng)時(shí)間高效的運(yùn)行,通過對(duì)申請(qǐng)空間小而申請(qǐng)頻繁的對(duì)象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下2021-08-08
C++中std::construct()與std::destroy()的使用
std::construct()和std::destroy()是C++ STL中的函數(shù)模板,用于在已分配的存儲(chǔ)區(qū)域中構(gòu)造或銷毀對(duì)象,本文主要介紹了C++中std::construct()與std::destroy()的使用,感興趣的可以了解一下2024-02-02
C++實(shí)現(xiàn)LeetCode(36.驗(yàn)證數(shù)獨(dú))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(36.驗(yàn)證數(shù)獨(dú)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Matlab利用垂距法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn)
垂距法是指根據(jù)中間頂點(diǎn)到其前、后兩相鄰頂點(diǎn)連線的距離的大小,來確定是否保留該頂點(diǎn)的一種線要素頂點(diǎn)壓縮算法。本文將利用這一算法實(shí)現(xiàn)提取離散坐標(biāo)數(shù)據(jù)特征點(diǎn),需要的可以參考下2022-04-04
C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解
為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時(shí)候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼2022-08-08
C++中std::count函數(shù)介紹和使用場(chǎng)景
std::count函數(shù)是一個(gè)非常實(shí)用的算法,它可以幫助我們快速統(tǒng)計(jì)給定值在指定范圍內(nèi)的出現(xiàn)次數(shù),本文主要介紹了C++中std::count函數(shù)介紹和使用場(chǎng)景,感興趣的可以了解一下2024-02-02

