c語言取數組地址嗎
A. 關於c語言數組的地址
數組名就是數組的首地址啊。
直接使用swaps(a,b)就可以
不過其實你子函數就寫錯了,根本就不是你所說的用數組地址做形參。而是要求用一個 二維數組或者是指針數組作為實參。
正確的代碼如下
#include<string.h>
#include<stdio.h>
chard[100];
voidswaps(char*p,char*q)
{
if(strcmp(p,q)>0)
{
strcpy(d,p);
strcpy(p,q);
strcpy(q,d);
}
}
intmain()
{
chara[]="",b[]="",c[]="";
printf("請輸入三個字元串,每輸入一個字元串按回車確認 ");
gets(a);
gets(b);
gets(c);
swaps(a,b);
return0;
}
voidswaps(char*p,char*q)就是要求傳一個地址(指針),而如果你使用
voidswaps(char*p[],char*q[])則意義就不對了,而是要求一個指針數組
B. C語言中怎麼輸出數組的首地址
%p
直接用16進制地址形式輸出地址
%d
把地址直接用10進制形式輸出
char
a[]
=
"hellow
C++";
int
b[]
=
{0x01,0x02,4,0x08,0};
如上數組如下輸出都可以:
printf("十進制地址%d
十六進制地址%p",
a,
a);
printf("十進制地址%d
十六進制地址%p",
b,
b);
printf("十進制地址%d
十六進制地址%p",
&a[0],
&a[0]);
printf("十進制地址%d
十六進制地址%p",
&b[0],
&b[0]);
C. C語言關於字元串數組取地址的問題。到底要不要&呢
格式"%s"輸入字元串到字元數組不需要加取址符&
D. C語言數組的地址
其實你這個疑問是概念上的混淆,或者說對指針了解上上的欠缺
首先講int a[3] = {2,3,4};
這里的a是這個數組的首地址,比如定義如:int *p = a;這時如果你進行如下操作:
p++;
printf("%d\n",*p);
結果會是輸出2,也就是說p+1相當於數組索引加1,但是像你所問的為什麼&a和a是相同的 ,首先要知道他們分別代表什麼意思,a:像上面所說的是數組的首地址,做自加運算會根據數組類型來計算偏移量,那麼&a是什麼東西呢,實際上它也是一個指針,是指向一個具有3個元素的數組的指針,如何理解,看以下定義:
如果你定義int *q = &a;這時編譯器肯定報錯,繪制出數據類型不一致,那麼你這樣樣定義就沒有問題:int (*q)[3] = &a;這時如果你再對q進行++操作,那麼加的就不同了,如相面的p++操作後p的值會加4,而這里q++操作後的值會加12,也就是跳過3個數組元素,然而,確實這兩個指針的初始值是一樣的,只是類型不一樣而已,這對二維數組的訪問時很方便的,這個你可以參照2維數組得到進一步理解,講的有點亂,不知道你能不能理解
E. c語言中,對一維數組名取地址
准確的說法,是變成了二級指針。
而二級指針,是指向指針地址的指針,變相相當於一個第一維度只有1的二維數組。
其中的根源,在於C語言中,聲明一個數組其實相當於申請了一個定長的指針(存儲位置不同,使用上還是有區別的),你可以將數組名當做指針使用,而反過來,也可以將一個指針,以數組的方式合法訪問其成員。而二維數組的聲明後,A[1][3],之後A[0]是一個一維數組,同樣A[0]保存的,也是這個一維數組的地址,A保存的是A[0]的地址,和二級指針相同。
F. C語言:數組的值是地址
不對。
數組名是數組的首地址,就是數組中第一個元素的地址,是常量。常量是不能出現在賦值號=左邊作為左值的。樓上的都沒有解釋清楚,說數組名就是指針是錯誤的,指針是變數,是用來存儲變數地址值的變數,而數組名是常量。一般情況下聲明一個數組,比如char a[10];之後,數組名a都是數組的首地址,是一個地址常量。但是在函數聲明的形參列表中除外。比如:int foo(char a[10]);在這種情況下這樣的聲明與int foo(char a[]);int foo(char * a);是等價的,就是說這種情況下,就算你寫的是數組的形式,編譯器實際處理的時候也當指針來處理(注意指針是變數,形參也是變數,二者剛好對應)。所以在函數foo內部,你對a進行++, --, +=,=之類的帶賦值的操作是完全合法的,因為此時a就是一個指針,不是數組名,當你往函數foo裡面傳入一個已經事先聲明的數組的首地址時候,指針a裡面的值就是你這個已經聲明的數組的首地址,這樣你在foo裡面就可以對你那個數組進行操作,正是因為C有這個傳地址的優點,所以省略了很多不必要的拷貝工作,試想如果沒有這個傳地址,你傳一個有幾萬個元素的數組進去,那拷貝工作是相當可觀的。這樣,你該明白了int main(int argc, char ** argv);裡面為什麼可以對argv進行++操作了,既然「main函數的第二個形參是一個指向字元串的指針數組」,argv出現在函數聲明中,所以它實際上是一個指針,它並不是「一個指向字元串的指針數組」,而是一個可以獲取「一個指向字元串的指針數組」的首地址值的變數。
G. 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]; // 取多維中的首個元素
H. C語言數組地址問題
解釋如下:
&a,*a,a,a[0]——都表示的是數組第0行第0個元素的地址;
*a[0]——這個特殊,表示第0行第0個元素的地址的地址;
a[2],&a[2]——都表示第2行第0個元素的地址;
&a[2][2]——表示第2行第2個元素的地址;
詳見圖片,我已經把數組中主要元素的地址和值都列印出來了,數組中對應的每個元素的地址寫出來了,對照的找下對應元素的位置,應該能理解&a,*a,a,a[0],*a[0],a[2],&a[2],&a[2][2]是什麼意思了
#include<stdio.h>
#include<stdlib.h>
intmain()
{
inta[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
printf("&a十六進制地址是%p,十進制是%d
",&a,&a);//數組名,a[3][4]
printf("*a十六進制地址是%p,十進制是%d
",*a,*a);
printf("a十六進制地址是%p,十進制是%d
",a,a);
printf("a[0]十六進制地址是%p,十進制是%d
",a[0],a[0]);
printf("*a[0]十六進制地址是%p,十進制是%d
",*a[0],*a[0]);
printf("a[2]十六進制地址是%p,十進制是%d
",a[2],a[2]);
printf("&a[2]十六進制地址是%p,十進制是%d
",&a[2],&a[2]);
printf("&a[2][2]十六進制地址是%p,十進制是%d
",&a[2][2],&a[2][2]);
printf("數組a[3][4]首元素a[0][0]的地址是%p,首元素a[0][0]的值=:%d
",&a[0][0],a[0][0]);
printf("數組a[3][4]首元素a[2][0]的地址是%p,首元素a[2][0]的值=:%d
",&a[2][0],a[2][0]);
printf("數組a[3][4]首元素a[2][2]的地址是%p,首元素a[2][2]的值=:%d
",&a[2][2],a[2][2]);
printf("一個int整型變數占的位元組是:%d",sizeof(int));
return0;
}
I. c語言中數組名和對數組名取地址一樣嗎
值是一樣的 但是類型不一樣
值都是數組的起始地址
但類型不同,如int a[10];
a的類型 是int *型。
而&a類型 是int **型。
這在賦值 自加等操作中 就會產生不同結果。