• 締切済み

C言語のプログラミング

C言語のプログラムを読もうとしているのですが、初心者故に難儀しており、お助けいただければ幸いです。 プログラムの内に下記のような「CnsktModule* 」の部分があります。 例えば、char *p; のような記述であれば、p はポインタでポインタの指し示す内容はキャラクタの型を 持っていると理解できるのですが、「CnsktModule* 」はどのように解釈したらよいのでしょうか? CnsktModule* cnsktNew(char *printer, char *locale, char *folder_path, int port_num) { 以下省略

みんなの回答

noname#82346
noname#82346
回答No.3

> p はポインタでポインタの指し示す内容はキャラクタの型を 持っていると理解できるのですが そこまで理解できているのなら簡単です。これが CnsktModule *p; という変数宣言であれば、同じように解釈して、p はポインタで、ポインタが指し示す内容が CnsktModule 型です。 CnsktModule* cnsktNew(...) の場合は、関数 cnsktNew の返値が CnsktModule *p; の p と同じ型である、というだけのことです。

bluemusash
質問者

お礼

回答をいただきまして有難う御座いました。 CnsktModule型をした構造体へのポインタ を返していることが理解できました。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.2

CnsktModule* cnsktNew アスターは右についてます CnsktModule *cnsktNew char *p; char* p; コンパイル結果は同じ。 char* p,q,r; は char *p,*q,*r; と錯覚してしまう間違いを誘発するので危険。 C++の開発者が始めた妙な記述が広まってしまいましたね。

bluemusash
質問者

お礼

回答をいただきまして有難う御座いました。 そうなのです。アスターの位置が左のCnsktModuleの お尻についているのかと思って理解できなかったのです。 CnsktModule型をした構造体へのポインタ を返していることが理解できました。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

当該の関数は、CnsktModule型へのポインターを返します。

bluemusash
質問者

お礼

回答をいただきまして有難う御座いました。 CnsktModule型をした構造体へのポインタ を返していることが理解できました。

関連するQ&A

  • C言語のポインタのことで

    int num=15; int *p=# char h= 'A'; char *p=&h; って、数字や一文字の時は変数を用意しなくてはならないのに、 char *z="K"; ←ダブルクォーテーションで囲むと1文字もOK printf("%c\n",*z); とか、 char *name="名前"; printf("%s\n",*name); とかの場合、変数を用意しなくてもできますよね。 文字はどこか別の場所に保管されているのでしょうか?

  • 上手く表示できない。(C言語)

    お世話になります。capeofdragonと申します。 Visual Studio 2008 ProでC言語を書いたのですが、 上手く表示されません。 やりたいことは、 256と言う、int型の値を、十分の一倍し、 25.6 と言う、文字列に置き換えて、 文字列として表示させることです。 以下にソースを添付します。 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> char *ftoa(int num) { char Num[10]; char rNum[10]; char decimal1[1]; char integer[2]; _itoa_s(num, Num, 10); integer[0] = Num[0]; integer[1] = Num[1]; decimal1[0] = Num[2]; if(integer[0] == '0') { rNum[0] = integer[1]; rNum[1] = '.'; rNum[2] = decimal1[0]; return rNum; } else { rNum[0] = integer[0]; rNum[1] = integer[1]; rNum[2] = '.'; rNum[3] = decimal1[0]; return rNum; } } int _tmain(int argc, _TCHAR* argv[]) { char *pWk; int a = 256; pWk = ftoa(a); printf("pWk = %s\n",pWk); return 0; } コンパイルすると、 pWk =  と表示され、 pWk = 25.6 と表示されません。 また、sprintfを使いたいのですが、 高速化のために、キャラクター操作とかけ算、シフトレジスタなどだけで シンプルに作成したいと考えています。 お手数をお掛け致しますが、 ご教授宜しくお願い致します。

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • プログラミング C++

    プログラミングのC言語で入力文字を関数を使ってポインタを使わずに逆順にするプログラムを作りたいのですが、ポインタを使ってならできるのですが、ポインタを使わずにはどのように考えればいいでしょうか?。 #include <string.h> void reverse (char *ss); int main(void) { char ss[14]; gets(ss); reverse(ss); printf("逆順=%s\n",ss); return 0; } void reverse(char *ss) { int a,b,c; b=0; c=strlen(ss)-1; while(b<c){ a=*(ss+b); *(ss+b)=*(ss+c); *(ss+c)=a; b++; c--; } }

  • C言語の初心者です。

    ポインタについて教えてください。 #include <stdio.h> int main() { int *p,a[2],i=0; p=a; scanf("%d",p); printf("%d\n",*p); i++; scanf("%d",p+i); printf("%d\n",*(p+i)); return 0; } これは整数を入力して出力といった簡単なプログラムなのですが、こういうポインタの使いかたって普通はしないでしょうか・・?。ポインタは使わずにこういう場合は2次元配列とかで出すのが普通なのでしょうか? また、下のプログラムなのですが、上記のプログラムをただ単にキャラ型で試しただけなのですが、どうして実行時エラーがおこってしまうのでしょうか? printfのところの*nameの、*を抜くと実行時エラーはおこりません。しかし、上記の整数では*はつけたままでも エラーしません。 整数とキャラ型では何かちがうのでしょうか?? #include <stdio.h> int main() { char *name,a[10]; name=a; printf("入力---"); gets(name); printf("%s\n",*name); return 0; } 初心者特有の質問をしてしまって申しわけございません。でも、ずっと悩んでて、すこしずつでもポインタの本当の使いかたを知りたいとおもいまして、初期段階ではありますがどうしても解らなかったので質問させていただきました。 そういうものだから!以外でご説明いただける方がいらっしゃいましたら宜しくお願いいたします。

  • C言語のこれを日本語にすると

    お世話になっております。 いまC言語のプログラムを勉強しているのですが こちらの意味が分かりません。 //使用変数の定義 int port; char s_port[7]; これを訳すとどういう意味になるのでしょうか? またかっこの7はどういう意味でしょうか? あわせてご回答宜しく御願いいたします。

  • c言語の境界調整について

    c言語の境界調整について 下記の質問プログラムのp=(int *)s; の境界調整は、intは、偶数の倍数で、charは、1バイトなので 先頭アドレスは、int, charも同じであるので配列全部0となるのでしょうか、    よろしくお願します。 *質問プログラム char s[4] = {1,2,3,4} ; int *p ; main() p=(int *)s;; *p=0 ; printf("%d %d %d %d\n",s[0],s[1],s[2],s[3];

  • C言語の基本的な質問ですが、関数へのポインタの宣言

    関数へのポインタの質問です。 下のように、関数へのポインタを使ったプログラムを書きました。 (関数へのポインタを理解するためのものなので、実用的な意味はありません。(*^_^*) また、このプログラムはコンパイルもリンクも実行も問題なく出来ます。) #include <stdio.h> int add_func(int,int); (*func_p0) (int,int); int main(void) { int (*func_p1) (int,int); int (*func_p2) ( ); int hoge0,hoge1,hoge2; func_p0=add_func; hoge0=func_p0(3,5); printf("0 : 3+5は%d\n",hoge0); func_p1=add_func; hoge1=func_p1(3,5); printf("1 : 3+5は%d\n",hoge1); func_p2=add_func; hoge2=func_p2(3,5); printf("2 : 3+5は%d\n",hoge2); return(0); } int add_func(int x, int y) { return(x+y); } func_p0のように戻り値の型を書かない場合と、func_p1やfunc_p2のように戻り値の型を書くのとでは何が違うのでしょうか。 func_p0は外部変数ですが、自動変数にする(main関数の中で同様に宣言。)とコンパイルエラーになります。 それはなぜですか。 func_p1のように引数の型が書いてあるのと、func_p2のように引数の型が書いていないのでは何が違うのでしょうか。 int (*func_p2) ( );というのは、int (*func_p2) (void);とは違うんですよね?

  • c言語のプログラミングについて聞きたいのですが

    自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

  • C言語プログラミングについて

    「要素数10の配列を準備する。 配列の各要素に0.0~1.0の乱数を入れる。 各配列に入力された乱数を出力する。 配列をオリジナル関数hanteiに渡す。 数hantei内において,各要素の値が0.5以上であれば1 , 0.5未満であれば0を出力する。」 C言語でこのような問題があるのですがどのように作ればよろしいのでしょうか? ちなみに以下のように作ってみて、「argcは一度も使用されていない」「argvは一度も使用されていない」とエラー(警告)が出てしまいました。修正、もしくは正しいプログラムを教えてくれませんか? #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 10 int hantei(double num) { return num>=0.5; } int main(int argc,char *argv[]) { double number[SIZE]; int i; srand((unsigned)time(NULL)); for(i=0;i<SIZE;i++) number[i]=(double)rand() / RAND_MAX; //手抜き乱数 for(i=0;i<SIZE;i++) { printf("%f %d\n",number[i], hantei(number[i])); } return 0; }

専門家に質問してみよう