このページは、ポインタと配列の関係 の記事を読んでおくと
理解しやすくなります。
int型配列を渡す
C言語では、配列のデータをそのまま関数に値渡しで渡す事はできません。
通常は、配列の先頭アドレスと要素数を渡して処理させます。
#include <stdio.h>
void show(int* ip, int len);
void main(void) {
int idata[3];
idata[0] = 5;
idata[1] = 15;
idata[2] = 25;
show(idata, 3); // show(&idata[0], 3); とも書ける。
}
void show(int* ip, int len) {
int ans = 0;
for (int i = 0; i < len; i++) {
ans = ans + *ip;
ip++;
}
printf("合計=%d\n", ans);
}
合計=555
このプログラムは、
配列idataのデータを全て足して表示するプログラムです。
関数showには、idataの先頭アドレスと要素数を渡しています。
ポインタだと多少分かりずらいので、
引数を配列形式で記述する事も可能です。
#include <stdio.h>
void show(int ip[], int len);
void main(void) {
int idata[3];
idata[0] = 5;
idata[1] = 50;
idata[2] = 500;
show(idata, 3); // show(&idata[0], 3); とも書ける。
}
void show(int ip[], int len) {
int ans = 0;
for (int i = 0; i < len; i++) {
ans = ans + ip[i];
}
printf("合計=%d\n", ans);
}
合計=555
配列形式で記述していますが、処理自体は同じです。
文字列を渡す
今度は、文字列も渡してみましょう。
文字列の場合は、終端文字が設定されているので、
関数に要素数を知らせる必要はありません。
#include <stdio.h>
void show(char* cp);
void main(void) {
char cdata[5];
cdata[0] = 's';
cdata[1] = 't';
cdata[2] = 'a';
cdata[3] = 'r';
cdata[4] = '\0';
show(cdata); // show(&cdata[0]); とも書ける。
}
void show(char* cp) {
printf("文字列=%s\n", cp);
}
文字列=star
文字列を渡す場合も先頭アドレスを渡してやればOKです。
文字列の終わりは、NULL(\0)が目印なので、問題ありません。
そのままprintf関数で表示する事ができます。
より正確に言うと、文字列を渡すと言う表現よりは、
文字列が格納されているアドレス値を渡す。と言う表現が正しいです。