首頁 > 軟體

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

2022-06-08 22:01:03

何為指標

指標這玩意說白了,就是用來儲存一個變數地址的東東 如圖:

(編輯器為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的值為%dna的地址為%pnprt存放的值為%pnprt的記憶體地址為%pnprt所存的地址對應的值為%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]=%dn",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]=%dn",i,p[i],i,*p[i]);
	
	}
	getchar();
}

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

字串陣列

C語言裡面沒有string類(java)也沒有str(python)只有字元,所以我們引入了字串陣列,用來儲存字串. ('a' 一個位元組 "a"兩個位元組) 這裡要注意一下的是,一個字串陣列如 char a[5]="hello",表面上看這裡只有五個字元,但是其實在他們的記憶體分佈裡面最後面結尾('o'後面)還有一個字元''表示結束,所以只用char a[5]放不下hello,char a[6]="hello"才行.所以"a" 是'a'+''兩個位元組(''不顯示)

#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("%sn",p); //%s 會讀取第一個字元的地址知道讀到''
	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("%cn",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語言指標內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com