真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

指針--C語言最重要和最復雜概念之一的重新理解-創(chuàng)新互聯(lián)

聲明:本文參照了C primer Plus中文版、翁凱C語言課程數(shù)組和指針章節(jié)

公司專注于為企業(yè)提供成都網(wǎng)站設計、網(wǎng)站建設、微信公眾號開發(fā)、電子商務商城網(wǎng)站建設,小程序開發(fā),軟件按需網(wǎng)站策劃等一站式互聯(lián)網(wǎng)企業(yè)服務。憑借多年豐富的經(jīng)驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務。

目錄

指針概念

訪問地址變量*

兩數(shù)交換

找到數(shù)組中的大值和最小值

指針最常見的錯誤

指針與數(shù)組

數(shù)組變量是特殊的指針

指針運算

*p++

指針類型


指針概念
  • 指針:用于存儲變量地址。從根本上來看,指針是一個值為內存地址的變量(或數(shù)據(jù)類型)。正如char類型變量的值是字符,int類型變量的值是整數(shù)。

作為參數(shù)的指針:

  • void f(int?*p)
  • 在被調用的時候得到某個變量的地址;
  • int i=0; f(&i);
  • 在函數(shù)里面可以通過這個指針來訪問外面的i。

下面看一個例子:

#includevoid f(int *p);

int main(){
	int i=6;
	printf("&i=%p\n",&i);
	f(&i);
	return 0;
} 

void f(int *p){
	printf(" p=%p\n",p);
}

從運行結果可以知道,i的地址是000000000062FE1C,通過f函數(shù)將地址取出來然后賦給了p指針,于是可以說p是一個指向i變量的指針。

訪問地址變量*
  • *是一個單目運算符,用來訪問指針的值所表示的地址上的變量
  • 可以做右值也可以做左值,比如:int k= *p;? *p=k+1;?
#includevoid f(int *p);
void g(int k);

int main(){
	int i=6;
	printf("&i=%p\n",&i);
	f(&i);
	g(i);
	
	return 0;
} 

void f(int *p){
	printf(" p=%p\n",p);
	printf("*p=%d\n",*p);
}

void g(int k){
	printf("k=%d\n",k);
}

void f(int *p){
	printf(" p=%p\n",p);
	printf("*p=%d\n",*p);
	*p=26;
}

傳進來的是i的地址,對*p進行修改實際上是對i的值進行修改,p是i的地址,*p用來訪問p指針所代表的值。

兩數(shù)交換
#includevoid swap2(int a,int b);
int main(){
	int a=5,b=6;
	swap2(a,b);
	printf("a=%d,b=%d\n",a,b);
	
	return 0;
}
void swap2(int a,int b){
	int t = a;
	a = b;
	b = t;
}

先分析一下這個程序能夠交換a,b兩數(shù)的值嗎?很明顯是不能交換成功的,我們只是在swap中重新定義了兩個值a和b,這里的a和b地址和主函數(shù)中的地址是不一樣的,對其進行交換的話也不能改變主函數(shù)中a和b的地址,地址不變的話,其值更不會改變。?

#includevoid swap(int *pa,int *pb);
void swap2(int a,int b);
int main(){
	int a=5,b=6;
	swap2(a,b);
	printf("a=%d,b=%d\n",a,b);
	swap(&a,&b);	
	printf("a=%d,b=%d\n",a,b);
	return 0;
}

void swap(int *pa,int *pb){
	int t = *pa;
	*pa = *pb;
	*pb = t;
}

void swap2(int a,int b){
	int t = a;
	a = b;
	b = t;
}

所以需要在函數(shù)中對其做到修改需要對地址進行修改。

找到數(shù)組中的大值和最小值
#includevoid minmax(int a[],int len,int *max,int *min);

int main(){
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,47,24,55,89};
	int min,max;
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);
	
	return 0; 
}

void minmax(int a[],int len,int *min,int *max){
	int i;
	*min = *max = a[0];
	for(i=1;i*max){
			*max=a[i];
		}
	}
}

指針最常見的錯誤

定義了指針變量,還未指向任何變量就直接開始使用。

p指向的地址可能恰好是不能賦值的地方,這時候可能就會報錯。

指針與數(shù)組

在不同的系統(tǒng)中,C語言指針的大小是不同的。
在32位系統(tǒng)(即x86)中,指針的大小為4字節(jié)。
在64位系統(tǒng)(即x64)中,指針的大小為8字節(jié)。

#includevoid minmax(int a[],int len,int *max,int *min);

int main(){
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,47,24,55,89};
	int min,max;
	printf("main sizeof(a)=%lu\n",sizeof(a));
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);
	
	return 0; 
}

void minmax(int a[],int len,int *min,int *max){
	int i;
	printf("minmax sizeof(a)=%lu\n",sizeof(a));
	*min = *max = a[0];
	for(i=1;i*max){
			*max=a[i];
		}
	}
}

可以看到在minmax中a的大小恰好等于一個指針的大小,

#includevoid minmax(int a[],int len,int *max,int *min);

int main(){
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,47,24,55,89};
	int min,max;
	printf("main sizeof(a)=%lu\n",sizeof(a));
	printf("main   a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);

	return 0; 
}

void minmax(int a[],int len,int *min,int *max){
	int i;
	printf("minmax sizeof(a)=%lu\n",sizeof(a));
	printf("minmax a=%p\n",a);
	*min = *max = a[0];
	for(i=1;i*max){
			*max=a[i];
		}
	}
}

#includevoid minmax(int a[],int len,int *max,int *min);

int main(){
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,47,24,55,89};
	int min,max;
	printf("main sizeof(a)=%lu\n",sizeof(a));
	printf("main   a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);

	return 0; 
}

void minmax(int a[],int len,int *min,int *max){
	int i;
	printf("minmax sizeof(a)=%lu\n",sizeof(a));
	printf("minmax a=%p\n",a);
	a[0]=1000;
	*min = *max = a[0];
	for(i=1;i*max){
			*max=a[i];
		}
	}
}

在maxmin中將a[0]改寫成1000,這個發(fā)現(xiàn)大值最小值都發(fā)生了變化,此時最小值為2,大值為1000,那么1000是怎么來的呢,很明顯是剛剛修改a數(shù)組后得到的。這時候也說明了函數(shù)參數(shù)中a[]表示的是一個指針。

既然是一個指針,那么寫成指針的形式肯定也沒有什么區(qū)別,將a[]修改成*a再進行編譯,發(fā)現(xiàn)沒有區(qū)別。

#includevoid minmax(int *a,int len,int *max,int *min);

int main(){
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,47,24,55,89};
	int min,max;
	printf("main sizeof(a)=%lu\n",sizeof(a));
	printf("main   a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);

	return 0; 
}

void minmax(int *a,int len,int *min,int *max){
	int i;
	printf("minmax sizeof(a)=%lu\n",sizeof(a));
	printf("minmax a=%p\n",a);
	a[0]=1000;
	*min = *max = a[0];
	for(i=1;i*max){
			*max=a[i];
		}
	}
}

  • 函數(shù)參數(shù)表中的數(shù)組實際上是指針 sizeof(a)== sizeof(int *)
數(shù)組變量是特殊的指針

數(shù)組變量本身表達地址,所以

  • int a[10];int *p=a;//無需使用&取地址
  • 但是數(shù)組的單元表達的是變量,需要用&取地址
  • a=&a[0]

[ ]運算符可以對數(shù)組做,也可以對指針做:

  • p[0]?<==>a[0]

*運算符可以對指針做,也可以對數(shù)組做:

  • *a=1;

數(shù)組變量是const指針,所以不能被賦值

  • int a[]<==>int * const a? ?不能再賦值
#includeint main(){
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,47,24,55,89};
	int *p = a;
	printf("*p=%d\n",*p);
    printf("p[0]=%d\n",p[0]);
	printf("p[5]=%d\n",p[5]);
	return 0; 
}

對著個代碼運行的結果可以這樣理解:p指針指向的是數(shù)組a,p[0]是指將所指的地方當做一個數(shù)組,取該數(shù)組的第1個元素,p[5]表示取數(shù)組a的第6個元素。

指針運算
#includeint main(){
	char ac[] = {0,1,2,3,4,5,6,7,8,9};
	char *p = ac;
	printf("p  =%p \n",p);
	printf("p+1=%p \n",p+1);
	
	int ai[] = {0,1,2,3,4,5,6,7,8,9};
	int *q = ai;
	printf("q  =%p \n",q);
	printf("q+1=%p \n",q+1);
	return 0;
}

地址變化:sizeof(char)=1,sizeof(int)=4.當我們給一個指針+1的時候,我們的地址變化并不是在地址值上+1,而是在地址值上加一個sizeof(數(shù)據(jù)類型)。?

這些算術運算可以對指針做:

  • 給指針加、減一個整數(shù)(+, +=,-,-=)
  • 遞增遞減(++/- -)
  • 兩個指針相減

兩個指針相減的結果是什么?通過以下程序可以很清楚的了解到。

這里也并不是直接的通過地址值相減,而是減完后除以了sizeof(數(shù)據(jù)類型),得到的是這兩個指針之間有多少個這樣的地址,或者能放幾個這樣的地址。

*p++
  • 取出p所指的那個數(shù)據(jù)來,完事之后順便把p移到下一個位置去
  • *p的優(yōu)先級雖然高,但是沒有++高
  • 常用于數(shù)組類的連續(xù)空間操作
  • 在某些CPU上,這可以直接被翻譯成一?條匯編指令

指針類型
  • 無論指向什么類型,所有的指針的大小都是一樣的,因為都是地址
  • 但是指向不同類型的指針是不能直接互相賦值的
  • 這是為了避免用錯指針

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


分享題目:指針--C語言最重要和最復雜概念之一的重新理解-創(chuàng)新互聯(lián)
當前路徑:http://weahome.cn/article/djjpij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部