c語言對數組名取地址
A. c語言中數組名和對數組名取地址一樣嗎
值是一樣的 但是類型不一樣
值都是數組的起始地址
但類型不同,如int a[10];
a的類型 是int *型。
而&a類型 是int **型。
這在賦值 自加等操作中 就會產生不同結果。
B. c語言中,對一維數組名取地址
准確的說法,是變成了二級指針。
而二級指針,是指向指針地址的指針,變相相當於一個第一維度只有1的二維數組。
其中的根源,在於C語言中,聲明一個數組其實相當於申請了一個定長的指針(存儲位置不同,使用上還是有區別的),你可以將數組名當做指針使用,而反過來,也可以將一個指針,以數組的方式合法訪問其成員。而二維數組的聲明後,A[1][3],之後A[0]是一個一維數組,同樣A[0]保存的,也是這個一維數組的地址,A保存的是A[0]的地址,和二級指針相同。
C. C語言中 用scanf函數輸入字元串數組,取地址符&是不用輸的,如果輸了取地址符算錯么 ,或者含義不一樣么
不一樣。
C語言的字元串為數組形式,而數組的名稱可以表示納慧其地址,故對字元串輸入不需要加地址符。而單獨的字元、整型變數等的名稱不能直接表示地址,故需要加地址符。
數組名就代表了該數組的地址。整個數組是一塊連續的內存單元,數組名所代表的地址為第0個元素的地址,c就代表c[0]的地址。
設數組c的首地址為0X2000,也就是說c[0]地址為0X2000,則數組名c就代表這個首地址。因為c已猜談經表示地址,所以在c前面不能再加取地址符&穗茄碰。
字元串數據類型是建模在形式字元串的想法上的數據類型。字元串是幾乎在所有編程語言中可以實現的非常重要和有用的數據類型。
(3)c語言對數組名取地址擴展閱讀
為了避免這種情況,可多設幾個字元數組分段存放含空格的串。程序可改寫如下:
#include<stdio.h>
intmain()
{
charstr1[20],str2[20],str3[20];
printf("Input string: ");
scanf("%s %s %s %s",str1,str2,str3);
printf("Your string: %s %s %s %s ",str1,str2,str3);
}
運行結果:
Input string: C C++ Java
Your string: C C++ Java
D. C語言關於字元串數組取地址的問題。到底要不要&呢
格式"%s"輸入字元串到字元數組不需要加取址符&
E. c語言求助!知道數組首地址怎麼求出數組元素地址
單維數組名就是首地址,多維數組名就是第1維的首地址,因此取首地址,可以把數組名賦給對應的指針變數,或取索引為0的首個元素地址賦給對應的指針變數。舉例:
單維
int
arr[10];
int
*
p
=arr;
或
int
*
p
=&arr[0];
二維
int
arr[10][10];
int
(*p)[10]
=arr;
或int
(*p)[10]
=
&arr[0];//
取第一維地址
int
arr[10][10];
int
*
p=
&
arr[0][0];
//
取多維中的首個元素
F. 關於C語言中對數組取址的問題,詳見補充:
對於一個數組來說,數組名是一個地址常量
並不是說是一個地址常量就沒有地址(也就是存儲常量的存儲單元)
當程序沒有被調入內存時候,是由三部分代碼組成的,依次是二進制代碼區(text segment),已經被初始化的靜態或者全局變數區(data segment),沒有被初始化的靜態或者全局變數區(bss segment),常量都是存放在data segment區
當程序被調入內存之後,就在三部分的基礎上又被分配了堆區和棧區,棧區用來存放臨時變數,參數和返回值等臨時的變數
就相當於我們定義char *a="12345",我們都知道這里的「a」是main()中定義的一個指向字元串「12345」的指針,那麼「12345」是存放在哪裡的呢,就是存放在data segment區的,而「a」變數本身確實存放在程序調入內存後被自動分配的棧區
強制轉換的本質上是不改變存儲單元中的01代碼組合的,只是告訴編譯器這個單元的數據將要被作為什麼數據處理,例如一個指針變數占據4位元組,一個int變數也是四個位元組,我們就可以把int強制轉換成指針的,需要的時候再把指針轉換成int,輸出int型結果時是不發生變化的
在這個題目中,「a」是一個數組名,也就是一個地址常量,這個常量存放在data segment區,「&a」取了「a」的地址,也就是一個指向「a」的指針,所以第三個語句是把指向「a」的指針進行了強制轉換,第一個語句直接轉換的「a」,第二個語句強制轉換指向「a[0]」的指針