指標和陣列
阿新 • • 發佈:2021-09-01
#include<stdio.h> int main() { int a; int *p=&a; printf("請輸入一個整數:"); scanf("%d",&a); printf("a=%d\n",a); printf("請再輸入一個整數:"); scanf("%d",p); printf("a=%d\n",a); return 0; }
結果:
請輸入一個整數:3
a=3
請再輸入一個整數:5
a=5
#include<stdio.h> int main() { charstr[128]; printf("請輸入魚C的域名:"); scanf("%s",str); printf("魚C工作室的域名是:%s\n",str); return 0; }
結果
請輸入魚C的域名:fishc.com
魚C工作室的域名是:fishc.com
scanf中的str沒寫&,因為陣列名就是一個地址資訊
陣列名其實是陣列第一個元素的地址!
#include<stdio.h> int main() { char str[128]; printf("str的地址是:%p\n",str); printf("str的地址是:%p\n",&str[0]); return 0; }
結果
str的地址是:000000000061FDA0
str的地址是:000000000061FDA0
地址一樣!
字元陣列,每一個元素都是一個字元,訪問字元的地址,當然要用&。
第二個元素的地址應該是第一個地址加上它所佔用的空間
#include<stdio.h> int main() { char a[]="Fishc"; int b[5]={1,2,3,4,5}; float c[5]={1.1,2.2,3.3,4.4,5.5}; double d[5]={1.1,2.2,3.3,4.4,5.5}; printf("a[0]:%p,a[1]:%p,a[2]:%p\n",&a[0],&a[1],&a[2]); printf("b[0]:%p,b[1]:%p,b[2]:%p\n",&b[0],&b[1],&b[2]); printf("c[0]:%p,c[1]:%p,c[2]:%p\n",&c[0],&c[1],&c[2]); printf("d[0]:%p,d[1]:%p,d[2]:%p\n",&d[0],&d[1],&d[2]); return 0; }
結果
a[0]:000000000061FE1A,a[1]:000000000061FE1B,a[2]:000000000061FE1C
b[0]:000000000061FE00,b[1]:000000000061FE04,b[2]:000000000061FE08
c[0]:000000000061FDE0,c[1]:000000000061FDE4,c[2]:000000000061FDE8
d[0]:000000000061FDB0,d[1]:000000000061FDB8,d[2]:000000000061FDC0
可發現它的規律的確是這樣
指向陣列的指標:
#include<stdio.h> int main() { char a[]="fishc"; char *p=a; printf("*p=%c,*(p+1)=%c,*(p+2)=%c\n",*p,*(p+1),*(p+2)); return 0; }
結果
*p=f,*(p+1)=i,*(p+2)=s
也可以不用指標,直接這樣也可以
#include<stdio.h> int main() { char a[]="fishc"; printf("*a=%c,*(a+1)=%c,*(a+2)=%c\n",*a,*(a+1),*(a+2)); return 0; }
結果一樣
還可以用指標直接定義字串,然後用下標法讀取每一個元素,倒過來,
#include<stdio.h> #include<string.h> int main() { char *str="I love FishC.com!"; int i, length; length=strlen(str); for(i=0;i<length;i++) { printf("%c",str[i]); } printf("\n"); return 0; }
結果
I love FishC.com!
還可以簡潔點
#include<stdio.h> #include<string.h> int main() { char *str="I love FishC.com!"; int i; for(i=0;i<strlen(str);i++) { printf("%c",str[i]); } printf("\n"); return 0; }