对字符数组输入输出数组名是否加取地址符的一些理解
生活随笔
收集整理的這篇文章主要介紹了
对字符数组输入输出数组名是否加取地址符的一些理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
字符數組名的兩個含義:
定義了字符型數組char name[10]。name有兩個含義:
- 一個是代表著name這個數組第一個位置的地址,也就是name[0]的地址。可以說name就等價于&name[0]。
- 還有一種意思就是指代name整個數組。&name 就是整個數組的首地址。所以name和&name取得的地址是相同的。
下面舉一個簡單的例子:
#include<stdio.h>
int main(void)
{char name[10]={"hello csdn"};if(name==&name[0]){printf("name與&name[0]取得的地址相同,地址為:%p",name);}else{printf("取得的地址不同");}return 0;
以下為代碼輸出結果:
name和&name區別
不同點在于:name+1表示的是數組第二個元素的地址,而&name+1表示的是整個數組后又一個name數組的首地址,即&name[10]后一個新的name數組的首地址。如下:`
#include<stdio.h>
int main(void)
{char name[10]={"hello csdn"};printf("name+1的地址:%p\n",name+1);printf("&name+1的地址:%p\n",&name+1);return 0;
}
輸出:
總結
所以說scanf("%s",name);和scanf("%s",&name);執行后的結果是一樣的,都是name的首地址,都是給字符數組name賦值。推薦用 scanf("%s",name); ,第二種不容易理解也容易犯錯,有些編譯軟件也不支持會報錯。
補充
printf("%s",name); 字符串的讀取。是從字符數組第一個地址name所對應的數據開始,對應ASCLL將其轉化輸出,直到遇見’\0’為止。這也就解釋了printf("%s",name);中的name既然是地址,為啥不加*號,不是*name而是name。就是因為它的輸出控制符的%s的作用。如果是printf("%d",name);的話,那么它輸出的將是name第一個元素的地址。
總結
以上是生活随笔為你收集整理的对字符数组输入输出数组名是否加取地址符的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql分页order by数据错乱重
- 下一篇: java.lang.NullPointe