一維數組和一級指針淺析
想要了更容易的了解指針,很好的用法就是通過數組來了解,在c裏面,感覺一維數組和一級指針的用法差不多,二維數組和二級指針的用差不多,所以通過數組來了解指針是一種很好的方法;
數組:將相同 數據類型 的元素按一定順序排列的集合,把有限個類型相同的 變量 用一個名字命名,然後用編號區分他們的變量的集合,這個名字成為數組
其實我們可以把數組看成是一個字符串,就像是C++中的string字符串類型的變量一樣,因為c中沒有關於字符串變量的定義,我們可以把數組看成是一個字符串吧!
數組和字符類型是不一樣的;
{
char a;
char b[64];
a = ‘a‘;
strcpy(b,"aaa");
}
就像上面這樣字符類型在空間中只分配有一個字節,而數組可以自定義的分配空間,數組寫入數據的時候也不像字符類型那樣可以直接寫入,可以通過鍵盤輸入,要麽就是像上面那樣;當然還有memcpy(),strncpy()等,這裏就不一一舉例了;
然後上面這段代碼要是這樣寫:
{
char a;
char b[64];
a = ‘a‘;
strcpy(b,"aaa");
printf("%c\n",a);// 輸出 a
printf("%d\n",a);//輸出 a 在ASCLL中的序號97
printf("%d\n",&a);// 輸出a的地址不同電腦可能不一樣
printf("%d\n",&b);//輸出地址7863796
printf("%d\n",b);///輸出7863796
printf("%d\n",&b[0]);//輸出地址7863796
system ("pause");
}
我們發現輸出&b,b,&b[0] 竟然都是b的地址,那麽我們可不可以吧b看成是指向b首地址&b[0]的指針呢?
{
char b[64];
char *c = NULL;
c = b;// 將一維數組的地址傳遞給指針
//或者 c = &b;
printf("%d\n",b);
printf("%d\n",c);
}
我們發現打印出來的結果是一樣的,那麽關於用法上我們也可以看看,其實這一點在數組作參數的退化問題哪裏我已經寫過了;
{
char a[64] = "aaaa";//直接往空間賦值了
char *b = NULL;
int i = 0;
int j = 0;
i = strlen(a);//計算字符串的個數
b = a;//將地址傳遞給b
//下面打印字符串,一個一個的通過下標打印
for(j = 0 ; j < i : i++)
{
printf("%c ",a[i]);
}
putchar(‘\n‘);//換行
for(j = 0 ; j < i : i++)
{
printf("%c ",b[i]);
}
//或者
for(j = 0 ; j < i : i++)
{
printf("%c ",*(b +j));
}
}
我們發現printf("%c ",a[i]);,printf("%c ",b[i]);,printf("%c ",*(b +j));三種輸出都可以將字符打印出來,效果完全一樣,所以我們可以將一級指針看成是一維數組,一維數組看成指針;但是記住這裏是看成,不能理解為是等價的;比如一級指針取地址可以傳遞給二級指針但是數組就不能。所以說如果用的話,我們可以把指針當成數組使用。
一維數組和一級指針淺析