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;



}


常見錯誤2ide

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

}
相關文章
相關標籤/搜索