对字符数组输入输出数组名是否加取地址符的一些理解
字符數(shù)組名的兩個(gè)含義:
定義了字符型數(shù)組char name[10]。name有兩個(gè)含義:
- 一個(gè)是代表著name這個(gè)數(shù)組第一個(gè)位置的地址,也就是name[0]的地址。可以說name就等價(jià)于&name[0]。
- 還有一種意思就是指代name整個(gè)數(shù)組。&name 就是整個(gè)數(shù)組的首地址。所以name和&name取得的地址是相同的。
下面舉一個(gè)簡單的例子:
#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;
以下為代碼輸出結(jié)果:
name和&name區(qū)別
不同點(diǎn)在于:name+1表示的是數(shù)組第二個(gè)元素的地址,而&name+1表示的是整個(gè)數(shù)組后又一個(gè)name數(shù)組的首地址,即&name[10]后一個(gè)新的name數(shù)組的首地址。如下:`
#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;
}
輸出:
總結(jié)
所以說scanf("%s",name);和scanf("%s",&name);執(zhí)行后的結(jié)果是一樣的,都是name的首地址,都是給字符數(shù)組name賦值。推薦用 scanf("%s",name); ,第二種不容易理解也容易犯錯(cuò),有些編譯軟件也不支持會(huì)報(bào)錯(cuò)。
補(bǔ)充
printf("%s",name); 字符串的讀取。是從字符數(shù)組第一個(gè)地址name所對(duì)應(yīng)的數(shù)據(jù)開始,對(duì)應(yīng)ASCLL將其轉(zhuǎn)化輸出,直到遇見’\0’為止。這也就解釋了printf("%s",name);中的name既然是地址,為啥不加*號(hào),不是*name而是name。就是因?yàn)樗妮敵隹刂品?s的作用。如果是printf("%d",name);的話,那么它輸出的將是name第一個(gè)元素的地址。
總結(jié)
以上是生活随笔為你收集整理的对字符数组输入输出数组名是否加取地址符的一些理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql分页order by数据错乱重
- 下一篇: java.lang.NullPointe