|
AKUMAです。
関数へ値を渡す方法というのが、複数あって混乱しています。
調べてみるとなにやら、値渡しと参照渡しの二つがあるみたい
ですね。たぶんそれらが基本となっていろいろな方法があるの
かもしれません。
とくに配列と構造体の場合たくさんの関数への渡し方があり
混乱しています。
暗記すればよいのですが、理解しないまま覚えるというのは
気持ちの悪いものですし、応用もききません。しかも、すぐ
忘れてしまします。
そこで、配列と構造体への関数への値の渡し方をご指導いただ
きたいと思います。
まず、下記のが基本的な関数への値の渡し方です。
これは理解できます。
#include <stdio.h>
int sum(int); /* プロトタイプ宣言 */
int main(void)
{
sum(50); /* 50を渡している */
return 0;
}
int sum(int max)
{
printf("%d\n",(1 + max) * max / 2);
return 0;
}
参考にポインタ渡しの場合
int x[3];
func(x);
void func(int *px)
{
}
次に関数に配列を渡す場合です。
プロトタイプ宣言
int showarray(int *);
または
int showarray(int x[3]);
関数
int showarray(int x[]);
または
int showarray(int x[]);
int showarray(int x[3]);
int showarray(int *x); ← この場合はポインタですが、xを渡すからですね
次の場合・・・
char *name[] = {
"徳川家康"
"田中正造"
"Thomas"
"エジソン"
}
showname(name);
int showname(char **p)
{
}
プロトタイプ宣言と関数
int showname(char *p[]) ← これはポインタ配列かな?
int showname(char **p) ← これはポインタのポインタですね
多次元配列の場合・・・
int a[][2] = {
1,2,
3,4,
5,6,
7,8,
};
showint(a);
int showint(int m[][2])
{
}
関数
int showint(int **) ← これの意味がとらえられないです。
int showint(int (*m)[2]) ← これの意味もわりません。
× *m[2] → *(m[2]) という意味になり駄目だそうですが、よくわかりません。
構造体の関数への渡し方
その1
void sub1(struct DATE_DATA data[],int i);
void sub2(struct DATE_DATA data[],int i);
sub1(data,i)
sub2(data,i)
void sub1(struct DATE_DATA data[],int i)
{
}
void sub2(struct DATE_DATA data[],int i)
{
}
その2
void sub1(struct DATE_DATA *data,int i);
void sub2(struct DATE_DATA *data,int i);
sub1(&data[i],i)
sub2(&data[i],i)
void sub1(struct DATE_DATA *data,int i)
{
}
void sub2(struct DATE_DATA *data,int i)
{
}
構造体の場合ですが、上記の二つだけしか渡し方は
ないのですかね・・・
ちょっと、話はずれますが、最後に下記のことについて。
ポインタの場合は下記のようにstrを更新できるそうです。
char *str;
str = "ABC";
str = "def";
しかし、配列だとできないみたいです、なぜ、ですかね・・・
ポインタの場合と配列の場合、ともにstrには、"ABC"の先頭の
アドレスが入ってる感じがするので平気なようにみえるの
ですがね・・・
配列は・・・
char str[] = "ABC";
str = "def";
不可
未熟者ですがご指導いただければありがたいですm(__)m
|