アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語入門者です。アドレス演算子について質問です。


//--- xおよびyが指す整数の値を交換 ---
void swap_int(int* x,int* y)
{
int temp=*x;
*x=*y;
*y=temp;

}

//--- sxおよびsyが指す文字列を交換 ---
void swap_str(char* sx,char* sy)
{
char temp[NAME_LEN];

strcpy(temp,sx);
strcpy(sx,sy);
strcpy(sy,temp);
}

//--- 配列numとstrの先頭n個の要素をnumに基づいて昇順にソート ---
void sort(int num[],char str[][NAME_LEN],int n)
{
int i,j;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(num[j-1]>num[j]){
swap_int(&num[j-1],&num[j]);
swap_str(str[j-1],str[j]);
}
}
}
}

関数sort内で整数型配列、文字型配列をソートするために関数swap_int, swap_strを呼び出しています。ここで、何故swap_intの引数にはアドレス演算子をつけ、swap_strにはつけないのでしょうか?理由を教えてください。

A 回答 (2件)

たとえば


char a[10];の場合、
aは、要素数10のchar配列の先頭アドレスを示しています。

同様に
char b[3][10]; の場合
b[0]やb[1]は、要素数10のchar配列の先頭アドレスを示しています。

ですから
> void sort(int num[],char str[][NAME_LEN],int n)
から、
str[j-1]や、str[j]は、要素数NAME_LENのchar配列の先頭アドレスを示すことになり、&は不要になります。



配列のアドレスを参照する
http://rainbow.pc.uec.ac.jp/edu/program/b1/Ex3-2 …
    • good
    • 1

>何故swap_intの引数にはアドレス演算子をつけ、swap_strにはつけないのでしょうか?理由を教えてください。


理由:str[i] は既にアドレス変数だから。

sortの引数をよく見てください
 int num[],   ← 1次元配列
 char str[][NAME_LEN] ←2次元配列
とありますよね。

つまり、i番目の要素である
 num[i]はint変数、
 str[i] はcharではなく、char[]のアドレス変数
ですよ。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!