掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27811

ポインタの配列の引数設定
投稿者---あきき(2006/08/03 01:08:14)


関数呼び出しにアドレス呼び出しがありますが、当サイトの関数での説明は理解できます。変数のアドレスを引数として呼び出す。例として
char型配列名を引数に設定した時、配列名の0番目の要素のアドレスが、引数として設定されますが、どの様にしたら、ポインタの配列の引数設定ができるか、まだつかめていません。下記のプログラムで試してみたのですが、
warning C4047: '=' : 間接参照のレベルが 'char *' と 'char ** ' で異なっています。;(注1)
当サイトの関数とポインタの章の見直しています。

なぜそうなるのか、ご指導のほどお願いします。


#include <stdio.h>

void func(char **qq)
{
    printf("%s\n",**qq);
}

int main(void)
{
    char *msg[] = {"おはよう","こんにちは","こんばんは"};
    char *p;
    char **pp;
    int i;

    p = msg;(注1)
    pp = &p;

    for(i=0;i < 3;i++)
    {
        func(pp);
    }

    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタの配列の引数設定 27812 shu 2006/08/03 03:18:54
<子記事> Re:ポインタの配列の引数設定 27813 Cn 2006/08/03 10:52:12


No.27812

Re:ポインタの配列の引数設定
投稿者---shu(2006/08/03 03:18:54)


//
//	サンプルプログラム
//

//
#include <stdio.h>

//
void print_pp(const char **pp)
{
    int i;
    
    for (i = 0; pp[i]; i++) {
        printf("%s ", pp[i]);
    }
}
void print_pp2(const char **pp)
{
    for (; *pp; pp++) {
        printf("%s ", *pp);
    }
}

//////////////
int main(void)
{
    char *msg[] = {"おはよう", "こんにちは", "こんばんは", NULL}, **pp;
    int i;
    
    //
    for (i = 0; msg[i]; i++) {
        printf("%s ", msg[i]);
    }
    putchar('\n');
    
    //
    for (pp = msg; *pp; pp++) {
        printf("%s ", *pp);
    }
    putchar('\n');
    
    //
    print_pp(msg);
    putchar('\n');
    
    //
    print_pp2(msg);
    putchar('\n');
    
    return 0;
}


コマンドライン引数
http://www9.plala.or.jp/sgwr-t/c/sec11-4.html

の辺りも参考になると思う。


この投稿にコメントする

削除パスワード

No.27813

Re:ポインタの配列の引数設定
投稿者---Cn(2006/08/03 10:52:12)


はじめまして、
私も昔似たようなところで戸惑ったので少し書かせて頂きます。

char *p ;
char *msg[] = {"おはよう","こんにちは","こんばんは"};
p = msg;

//----------------------------------------------------------
「p = msg ;」として表記すると
「キャラ型ポインタ」の「配列の先頭アドレス」の値「msg」を
「キャラ型のポインタ」「p」に代入しようとしていることになります。

「配列の先頭アドレス」はポインタとして扱われるので、
「msg」は「キャラ型ポインタ」の「ポインタ」つまり「char**」
になります。

そして「p」は「キャラ型のポインタ」なので「char*」になり、
「char*」 に 「char**」は代入できないのでエラーとなります。

正解としては
「p = msg[ 0 ] ;」となります。


目標としては「配列」を図解して誰かに説明出来るくらいになると
この辺の問題には引っかからなくなると思います。
この辺はややこしい所ですが、めげずにがんばって下さい。
私は今でも油断してると間違ってしまいます(汗


追伸
ちなみにですが、
void func(char **qq)
{
printf("%s\n",**qq);
}
もすこし間違っています。

printf("%s\n",*qq);
とか
printf("%c\n",**qq);
とかが正解です。


この投稿にコメントする

削除パスワード

No.27821

Re:ポインタの配列の引数設定
投稿者---あきき(2006/08/03 23:54:54)


解説とサンプルプログラムを示していただいたので何とか理解できそうです。ポインタの配列の型が、char**型だったとははずかしい。当分ここら辺を学習します。shuさん、Cnさんありがとうございます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧