挨拶
前回に続き、C言語の学習を進めます。
環境
- OS:Pop!_OS(ubuntu形ディストリビューション)
- コンパイラ:GCC(C17)
今回の学習
戻り地以外の方法で値を返してもらう方法
ここから学習を進めて行きます。
処理の概要はコードコメントに、細かい処理の説明や補足はコード後に書いています。
まずは、ポインタを使って変数に値を格納する方法から行っていきます。
/*ポインタを使って2つの変数に値を入れる*/
// 値を受取り値を格納する関数を定義
void func(int *a,double *b){ //引数にポインタを指定
//アドレスに格納する
*a = 5;
*b = 10.5;
}
int main(void){
//戻り値以外の方法で値を渡す
int a;
double b;
func(&a,&b); //変数のアドレスを引数で渡す
printf("a..%d b..%f\n",a,b);
return 0;
}
この処理は、ポインタ変数と単項演算子(&)を使いポインタ変数の指す先に値を格納している。
通常C言語の関数では、戻り地で返せる値は1つ。
しかし、この方法なら返したい値をアドレスに格納、そのアドレスをポインタ変数で参照することで、複数の値を定義することができる。
配列を関数の引数として渡す
このテーマについてですが、C言語の引数に配列を指定することはできません。
しかし、渡したい配列の先頭要素のポインタを渡すことで、配列を引数で渡したように扱うことができます。ただし、これはあくまで"見せかけ"であり、実際に引数として配列を渡しているわけではありません。
/*配列の先頭要素のポインタを引数に指定*/
void func2(int *array,int size){
//for文を使い渡された配列の要素を出力
int i;
for(i = 0; i < size; i++)
{
printf("array[%d]..%d\n",i, array[i]);
}
}
int main(void){
int array[] = {2,2,3,4,5,6};
func2(array,sizeof(array) / sizeof(array[0]));
//コメントでの指摘を取り込み"%lu"-> "%zu"に変更しました。
printf("%zu\n",sizeof(array)/sizeof(array[0]));//配列のサイズ
return 0;
}
このコードでは、配列の先頭要素のポインタを引数で渡し、関数内のfor文で渡された値を出力しています。その際、出力する回数に配列の大きさを指定することで配列の要素全てを出力させています。
補足:sizeofの型について
コメントでsizeofの型についてご指摘いただきました。
sizeofの型は"size_t"であり、このsize_tの具体的な型は処理系が決めるため、printfで表示する際は %lu(unsigned long)ではなく%zuを使うのが望ましいそうです。
そのためコードを一部修正しました。