#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,否則下標就越界了。
*/
}
執行結果
#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當作字串進行輸出,
}
執行結果
#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?查詢子串*/
執行結果