帶你分分鐘玩轉C語言指針

何為指針

指針這玩意說白瞭,就是用來存儲一個變量地址的東東 如圖:

(編輯器為vc2010)

#include<stdio.h>
void main(){
	int a,*p;
	a=5;
	p=&a;
	printf("a=%d,p=%p,*p=",a,p,*p);
	getchar();

}

所以通過剛剛的情況,我們發現通過指針我們不僅可以獲取一個變量的值還可以直接對變量的值修改

又如下面的例子:

#include<stdio.h>
void main(){
	int a=3;
	int* prt;
	prt=&a;
	printf("a的值為%d\na的地址為%p\nprt存放的值為%p\nprt的內存地址為%p\nprt所存的地址對應的值為%d",a,&a,prt,&prt,*prt);
	getchar();

}

數組指針

說到指針隻說基本的int char float有什麼意思,接下來是一個數組指針 將數組和指針結合起來.當然數組本身在傳遞的時候就是以指針傳遞的. 下面是以段代碼演示

#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();
}

我們發現當p=a(指針指向數組a)後,指針p可以和數組a一樣操作,這就是指針數組.

指針數組

既然說到瞭指針數組那麼就不得不說數組指針,乍一看這兩個名字很像,其實差距還是很大的. int *p[] 下面還是以上面的例子為例,我們讓輸出結果一致

#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();
}

我們發現,這個東東其實就是一個存儲地址的數組,這個內存地址既可以是int char 或者float 同時也可以是數組,這個我們在說完字符串數組後再說.

字符串數組

C語言裡面沒有string類(java)也沒有str(python)隻有字符,所以我們引入瞭字符串數組,用來存儲字符串. ('a' 一個字節 "a"兩個字節) 這裡要註意一下的是,一個字符串數組如 char a[5]="hello",表面上看這裡隻有五個字符,但是其實在他們的內存分佈裡面最後面結尾('o'後面)還有一個字符'\0'表示結束,所以隻用char a[5]放不下hello,char a[6]="hello"才行.所以"a" 是'a'+'\0'兩個字節('\0'不顯示)

#include<stdio.h>
void main()
{
	char a[6]={'h','e','l','l','o'};
	//char a[6] ="hello";也行
	printf("%s",a);
	getchar();
}

此外還要註意一點直接寫一個"hello"也是一個字符串數組隻不過未命名罷瞭,我們可以用指針訪問

#include<stdio.h>
void main()
{
	char *p="hello";
	printf("%s\n",p); //%s 會讀取第一個字符的地址知道讀到'\0'
	printf("%c",p[1]);//輸出字母e
	getchar();
}

數組指針的sao氣操作

先看一段代碼

#include<stdio.h>
void main(){
	char *p[3]={
		"hello",
		"my",
		"friend"
	};
	printf("%s",p[1]);
	getchar();
	
}

現在我們發現p[1]可以和一個字符指針一樣操作,也就是說 p[1]等價於

char a[4]="my",*c; c=a; 這裡的c就等價於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();
}

二級指針

這個傢夥,就是套娃,看一張圖就明白瞭

函數指針

int (*p)( int x) int 指向的函數類型 (*p)指針名字 (int x) 所指向的函數所需要輸入的參數

這個呢就是一個函數 舉個例子

#include<stdio.h>
void main(){
	int go(int x);
	int x,(*p)(int x);
	scanf("%d",&x);
	p=go;//指針指向函數
	//(*p)(x)也行
	p(x);
	getchar();
	getchar();
}

int go(int x)
{
	printf("you input number is:%d",x);
}

這玩意的好處是啥呢, 有瞭這玩意,我可以直接向一個函數裡面傳遞另一個函數 舉例升級

#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);

}

指針函數

說白瞭這就是一個函數,返回瞭一個地址如:

int* go (int* x,int* y)

和函數指針長得像,原因在於* 得運算級別比()低所以函數指針加瞭() 舉個例子

#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;
}

文件指針

這個就有意思瞭,C語言把所有的設備都視為指針. 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是最大長度) 區別是什麼呢,fprintf()讀到空格或回車就返回,fgets()讀到回車返回 此外還要fread() fread(接收數據的地址,讀取多少字節的內容,數據項個數,文件指針) 其他的查手冊就好 最後別忘瞭關閉 fclose(fp)

總結

到此這篇關於C語言指針的文章就介紹到這瞭,更多相關C語言指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: