指針 二維陣列 string.h用法

2020-08-14 19:09:35

陣列的首地址

#include<stdio.h>

void  main()

{
	
	int  i;
	
	int  A[5],b[5];           //宣告瞭2個數組變數,未賦值 
	
	double  f[6]={1.0,2.0,3.0};
	/*對陣列f來說: 容量爲6,只指定了前3個數組元素的值,
	那麼後3個元素就取值預設值0.0 */ 
	
	char   ch[]={'a','b','c','d'};//全部賦值了;容量是4
	 
	/*對陣列A來說,若現在這樣 A[5]={1,3,5,7,9}; 或者A={1,2,3,4,5};來賦值都是錯誤的
	因爲宣告與賦值分開了,整體賦值就是錯誤的*/ 
	A[0]=1,A[1]=2,A[2]=3,A[3]=4,A[4]=5;  //right,現只能一個個單獨賦值了 
	
	printf("please input 5 int for A:\n");
	
	for(i=0;i<5;i++)  scanf("%d",&A[i]); //right,使用回圈一個個單獨賦值
	 /*即使是同類型、同容量的兩個陣列,這樣b=A;或者A=b;賦值都是錯誤的。因爲數
組名代表陣列的首地址,是--一個整型常數,不能修改;
&b[2]=&A[4];這條語句也是錯誤的。因爲任何變數宣告之後,它的儲存地址就確定下來
了,是不能被修改的
*/

	
	b[2]=A[4],b[0]=1,b[1]=0,b[3]=0,b[4]=0;      //right, 對陣列元素值可以修改 
	
	printf("A:");   printf("陣列的首地址是: %d\n",A); 
	
	for(i=0;i<5;i++)
	
	     printf("A[%d]的儲存地址是:%d,  值是:%d\n",i,&A[i],A[i]);
	     
	printf("\n");
	
	printf("b:");   for(i=0;i<5;i++) printf("%d\n",b[i]);
	
	printf("f:");   for(i=0;i<6;i++) printf("%f\n",f[i]);
		
	printf("ch:");   for(i=0;i<4;i++) printf("%c",ch[i]);
			
	printf("\n");    printf("---A:");
			
	/*for(i=0;i<8;i++) printf("%d ",A[i]);print("\n");
這裏的for回圈中,i取5、6、7時,對A[5]、A[6]、 A[7]進 行操作是錯誤的,因爲宣告
的陣列A最多隻允許儲存5個整數,下標只能是0~4,否則下標就越界了。
*/

}

執行結果
在这里插入图片描述

指針1

#include<stdio.h>

void main()

{
	
	int  A[5]={0,1,2,3,4};
	
	int  *pa=A;
	/**pa是一個一級指針變數,一級指針類似於一個一維陣列;
	上句等價於int *pa;pa=A;即分兩步,先宣告指針變數,後賦值*/ 
	
	printf("%d  ",*pa);
	
	printf("%d  ",pa[2]);
	
	printf("%d  ",*(A+2));       //即A[2] 
	
	pa=&A[2];                    //*pa指向A[2]元素 
	
	printf("\n%d\n",pa[2]);      //*pa+2是&A[4] 
	
	printf("%d  ",++pa);         //即先pa=pa+1;再輸出*pa,即A[5]
	
	//printf("%d  ",*++A); 錯誤,不行 
	
	for(pa=&A[1];pa<A+8;pa++) printf("%d",*pa);
	
}

執行結果
在这里插入图片描述

二維陣列

#include<stdio.h>

void main()

{
	
	int  arrB[3][4]={
	
	     {1,2,3,4},
	
	     {5,6},
	     
	     {7}
	     
	};
	
	int  *pb;
	
	int  i,j;
	/*使用二重回圈輸出二維陣列的元素*/
	
	for(i=0;i<3;i++)
	
	{
		
		for(j=0;j<4;j++)
		
		     printf("%d",arrB[i][j]);
		     
	    printf("\n");
	    
	}
	
	printf("-----------\n");
	
	/*使用二重回圈、指針的方式輸出二維陣列的元素*/
	for(i=0;i<3;i++)
	
	{
		
		for(j=0;j<4;j++)
		
		     printf("%d",*(arrB[i]+j));
			 /* 即arrB[i][j],也可寫成*(*(arrB+i)+j) */
		     
		printf("\n");
	}
	
	printf("-----------\n");
	
	pb=&arrB[0][0];/*也即 pb=*arrB;或者pb=arrB[0]; */
	
	/*下面 下麪的回圈,把二維陣列當作-一-維陣列來看待*/
	for(i=0;i<12; )
	
	{
		
		printf("%d",pb[i]);/* 也 可寫成*(pb+i)*/
		
		i++;
		/*這兩條語句等價於printf("%d ",*pb++);也就是先*pb,再pb++*/
		
		if(i%4==0) printf("\n");
		
	}
	
	printf("\n");
	
	
	/*pb=arrB;是錯誤的,pb 是一級指針, arrB 是二維陣列名,兩者型別不匹配*/
     int **p2b;
    /*p2b=arrB;錯誤*/

	
} 

執行結果
在这里插入图片描述

字串的輸出

#include<stdio.h>

void main()

{
	
	int  i;
	
	char   str1[]={0,'a','b','c',0,0,'d','e',0};
	
	char   str2[]="Love!";  char str3[10];
	
	printf("%s\n",str1);
	/*printf函數與格式控制符%s組合在一起的意思是輸出字串。這裏輸出的結果是空串
	因爲str[0]=0即是'\0 .空串的串長爲0,即僅爲一個'\0組成的串*/
	
	puts(&str1[1]);          //輸出從第2個字元開始的字串 
	
	printf("%s\n",&str1[1]); //輸出從第2個字元開始的字串 
	
	printf("%s\n",&str1[6]); //輸出從第7個字元開始的字串 
	
	for(i=0;i<9;i++)  printf("%c",str1[i]);//注意這個輸出的結果 
	
	printf("\n%s",str2);
	//輸出函數的參數是陣列名或指針,即是輸出從這個地址開始的字串
	
	puts(str2);
	
	puts("input string for str3:");
	
	gets(str3);  puts(str3);
	
	char  str4[]={'a','b','c','d'} ;//str4是一個字元陣列,不是字串
	
	printf("\nstr4=%s\n",str4);
	//把str4當作字串進行輸出, 
	 
} 

執行結果
在这里插入图片描述

string.h用法

#include<stdio.h>
#include<string.h>

void main()

{
	
	char   s[4]={'1','2','a','b'};//不是字串 
	
	printf("%s\n",s);          //輸出是 
	
	char   str1[100]="c program.";
	
	char   str2[]="c programmer.";
	
	str2[0]='A'; puts(str2);
	
	char   *pstr="English,";        //*pstr指向一個字串常數 
 /*pstr[1]='X"; error? 因爲不能改變字串常數中的字元;
譬如:charstr3[]="Logic";str3[0]='M';是正確的。因爲修改的是字元陣列中元素的
值,不是字串常數的值。
*/

	printf("Length:%d\n",strlen(str1));
	
	char  str4[]="ab\tc\nd\\E";           //含跳脫字元 
	
	printf("\n%d\n%s\n",strlen(str4),str4);  //注意輸出結果 
	
	printf("Compare:%d\n",strcmp(str1,str2));
	// *字串比較相當於將對應字元的ASCII碼相減*/
	
	printf("concat:%s\n",strcat(str1,pstr));    //串連線 
	
	strcat(str1,str2); printf("concat:%s\n",str1); 
	//連線後的字串放入str1中,其容量必須足夠大 
	
	char str5[20]="121234a1234b" ,*subStr="1234a";
	
	printf("-%s\n",strstr(str5,subStr));        //定位子串 
	
	strcpy(str5,subStr); printf("---%s\n",str5);//串拷貝 
	
	printf("......%s\n",strchr(str5,'a')); //定位字元a 
	
	printf("--------%s\n",strchr(str5,'b'));//定位字元b 
	
}
/*#include「string.h」是在程bai序編譯之前要處理的內容,
與字du符串zhi的呼叫有dao關

包括常用函數如下:
strlen求字串長度

strcmp比較2個字串是否一樣

strcat字串連線操作

strcpy字串拷貝操作

strncat字串連線操作(前n個字元)

strncpy字串拷貝操作(前n個字元)

strchr查詢字串

strstr?查詢子串*/

執行結果
在这里插入图片描述