1. 程式人生 > >c語言指針2

c語言指針2

指針


指針的重要性

#include <stdio.h>

/*
	指針的重要性:

		1,表示一些復雜的數據結構

		2,快速的傳輸數據

		3,使函數返回一個以上的值

		4,能直接訪問硬件

		5,能夠方便的處理字符串

		6,是理解面向對象語言中引用的基礎

		總結:指針是c語言的靈魂

	
	 指針的定義:
			地址:
				
				內存單元的編號
				從零開始的非負數整數

				範圍:如果是32位的機器就是從【0--4G-1】


			指針:
				
				指針就是地址,地址就是指針
				指針變量就是存放內存單元編號的變量,或者說指針變量就是存放地址的變量
				指針(0019FF38)和指針變量(p)是兩個不同的概念
				但是要註意:通常我們敘述時會把指針變量簡述為指針,實際含義並不一樣
				指針的本質就是一個操作受限的非負整數(不能加乘除,可以減)


		
	 指針的分類:
			

		1,基本類型指針
		
			
					
						int * p;      // p是變量的名字,int *表示p變量存放的int類型變量的地址
									  // int *p 不表示定義了一個名字叫做*p的變量
									  // int *p 應該這樣理解:p是變量名,p變量的數據類型是int *類型
									  //  所謂int *類型實際就是存放int變量地址的類型
 
						int i = 3;
						int j;
						p = &i;  
						
 
								1,p保存了i的地址,因此p指向i
 
								2,p不是i,i也不是p,更準確的說,修改p的值不會影響i的值,修改i的值也不會影響p的值
 
								3,如果一個指針變量指向了某個普通變量,則
             
										*指針變量   就完全等同於  普通變量
                     
										例子:
											如果p是個指針變量,並且p存放了普通變量i的地址
											則p指向了普通變量i
                         
											*p 就完全等同於i
											或者說:在所有出現*p的地方都可以替換成i
													在所有出現i的地方都可以替換成*p
													printf("%d\n",i); //輸出3
													printf("%d\n",*p); //輸出3
											*p 就是以p的內容為地址的變量
         
					
						j = *p;
 
						printf("i = %d ,j = %d ,*p = %d \n",i,j,*p);  //結果i = 3 ,j = 3 ,*p = 3
					
 
				

		

		2,指針和數組

		3,指針和函數

		4,指針和結構體

		5,多級指針



*/


int main(void)
{
		
	return 0 ;		
}

常見錯誤1

#include <stdio.h>


int main(void)
{

	int i = 5 ;
	int * p ;
	int * q;

	p = &i;

	//q = &i;
	
	//*q  = p; //error語法編譯會出錯  在這裏*q是一個值,是一個int類型 而p是int * 是個地址,類型不一致,所以報錯

	//*q = *p;  //因為q沒有賦值,相當於沒有地址,所以會分配垃圾地址,造成非授權訪問,為了避免非授權訪問,所以程序報錯

	// p = q;  q是垃圾值,q賦給p p也變成垃圾值

	printf("%d\n",*q); //q的空間是屬於本程序的,所以本程序可以讀寫q的內容,但是q的內部是垃圾值,則本程序不能讀寫*p的內容


	return 0;



}


常見錯誤2

#include <stdio.h>

//把5賦值給了一個不知道的單元,所以程序報錯


int main(void)
{
	int * p;
	
	int i = 5;

	*p = i;
		
	
	printf("p的地址是%p\n",&p);
	printf("i的地址是%p\n",&i);
	printf("*p的值是%d\n",*p);
	//printf("%d\n",*p);
	
	return 0;


}


經典程序互換兩個數字

#include <stdio.h>
/*
	*號的含義:
		1,乘法
		2,定義指針變量
		3,指針運算符
			該運算符放在已經定義好的指針變量的前面
			如果p是一個定義好的指針變量
			則*p表示以p的內容為地址的變量
				


 */



void huhuan_1(int ,int );
void huhuan_2(int * , int *);
void huhuan_3(int * , int *);

int main()
{
	int a = 3 ;
	int b = 5;

	huhuan_1( a, b);  	
	printf("a=%d,b=%d\n",a,b);  //a=3,b=5

	huhuan_2( &a, &b);  	    //huhuan_2( a, b);錯誤;	huhuan_2( *p, *q);也是錯誤的
	printf("a=%d,b=%d\n",a,b); //a=3,b=5
	
	huhuan_3( &a, &b);  	  
	printf("a=%d,b=%d\n",a,b); //a=5,b=3


	return 0;
}


//不能完成互換
void huhuan_1(int a,int b)
{
	 int t;

	 t = a;
	 a = b;
	 b = t;

	 return;

}



//不能完成互換
void huhuan_2(int * p, int *q) //因為p和q才是變量,存儲的是地址,所以在主函數裏傳過來的也是地址,所以是	huhuan_2( &a, &b);  
{

	int * t;
	
	 t =  p;
	 p =  q;
	 q =  t;
	

}

//可以完成互換
void huhuan_3(int * p, int *q) 
{

	int t;  //如果要互換*p和*q的值,則t必須定義成int,不能定義成int* 否則語法報錯
	
	 t =  *p; //p是int * ,*p的int
	 *p =  *q;
	 *q =  t;
	

}


c語言指針2