• ベストアンサー

&と*の違い

miswaki777の回答

回答No.5

int &k = i1; と書いた場合、変数kは変数i1への参照となります。 ただし、これは、C++の使える記述で、Cだと参照という概念自体使えません。 参照というのはこの場合、別名の意味になりますので、 k = 2; とすると、i1の値も、2となります。 つまり、kとi1は常に同じ値となります。 参照は、関数の中で定義するときは、初期化の時にしか使えません。 pString = &chBuffer; などと、書いた場合は、&はポインタとして使われますが、変数の宣言と初期化のときに int &k = i1; と書いた場合は、ポインタとは違いますので、注意してください。 あと、コンパイルエラーについてですが、よくわかりませんが、i2が宣言されていて、ちゃんと値が代入されているかどうかチェックしてみてください。 私の使っているコンパイラでは、 int i1 = 2; int i2; int &i = i1; i = i2; のようなコードを書くと、「値が割り当てられていないローカルな変数 'i2' に対して参照が行われました。」といった警告が出ます。

関連するQ&A

  • プログラムを作ったのですがエラーメッセージが出ます

    原因がわかりません。他にもいくつか作ったのですが他のものはコンパイルします。 エラーメッセージ fatal error c1083 ソースファイルが開けません 因みに作ろうとしているプログラムは * ** *** **** ***** **** *** ** * を描画させるものです #include<stdio.h> main() { int i, j; int k; for(i=1; i<=9; i++){ if(i<5){ k=i; } if(i>=5){ k=10-i; } for(j=1; j<=k; j++){ printf("*"); } printf("\n"); } }

  • 行列の和のプログラミング

    以下のをCソースを打ち込んでコンパイルすると、 warning: passing arg 1 of `mat_add' from incompatible pointer type warning: passing arg 2 of `mat_add' from incompatible pointer type となります。これは、どういうエラーでどう直せばいいのでしょうか? #include <stdio.h> void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {10, -5, 4}, {18, -2, -18} }; int mb[2][3] = { {23, 16, -9}, {-3, 20, 5} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }

  • なぜコンパイルエラーにならない?

    flag: for ( int i= 0 ; i<5 ; i++){ for(int j=0 ; j<3 ; j++){ label:  if(i<j){ i++; continue label; } System.out.println("あ"); } } ある問題集の問題なのですが、ラベルをfor かwhile 以外につけているのでコンパイルエラーになるという問題でした。 納得。 確かに、打ち込んでみると、コンパイルエラーになります。 しかし、continue を break に変更すると、コンパイルエラーにはならないのです。 なぜでしょうか。 テキストでは、break であれ continueであれ、for や while 以外につけるとコンパイルエラーになると書かれています。 どなたか、教えていただけますか?

    • ベストアンサー
    • Java
  • 2次元のvectorにオブジェクトのポインタを格納

    VC++6.0です。 まず、ポインタでなく、int型の格納なら分かったんです。 ・・・ #include <vector> using namespace std; main(){ vector <vector<int > > a(10); ←←← for(int i=0;i<10;i++){ a[i].resize(10); } ・・・ for(int j=0;j<10;j++){ for(int i=0;i<10;i++){ a[i][j]=i+j; } } ・・・ } という感じで利用できることが。 しかし、やりたいのは、整数型でなく、 オブジェクトのポインタを格納したいんですが、 矢印部分を例えば、vector <vector<class *> > a(10); などどしてもエラーになってしまいます。 どのように実装したらよいのでしょうか?

  • 数独を解くアルゴリズム

    バックトラック法で解いているのですが、どこがおかしいのか見当もつかないので教えてください。 コンパイルエラーはありません。 表示の関数は省いてあります。 よろしくお願いします。 #include <stdio.h> #define M 3 //小さいブロックのサイズ #define N M*M //全体のサイズ #define MTX N*N //全体のマス数 int sudoku[N][N]={    {0,2,4,5,0,0,6,0,0},    {0,0,6,3,2,0,0,0,4},    {0,0,5,0,9,0,0,8,3},    {0,0,8,4,0,3,0,0,1},    {0,6,1,9,0,0,4,3,0},    {7,0,0,1,0,0,5,0,0},    {8,3,0,0,4,0,9,0,0},    {4,0,0,0,3,5,8,0,0},    {0,0,7,0,0,9,3,4,0}    }; /* 候補がOKかどうかチェック */ int OKkouho(int x, int y, int k) {    int i,j;    int p,q;    for(i=0; i < N; i++){ //その行に候補は入るか       if(sudoku[y][i] == k)          return 0;    }    for(j=0; j < N; j++){ //その列に候補は入るか       if(sudoku[j][x] == k)          return 0;    }    p = x/M*M;    q = y/M*M;    //そのブロックに候補は入るか    for(j = q; j < q+M; j++){       for(i = p; i < p+M; i++){          if(sudoku[j][i] == k)             return 0;       }    }    return 1; } void Solve(int level) {    int k;    int x,y;    if(level >= MTX){       printf("OK");       return;    }    x = level%N;    y = level/N;    if(sudoku[y][x])       Solve(level+1);    else{       for(k = 1; k <= N; k++){          if(OKkouho(x,y,k)){             sudoku[y][x] = k;             Solve(level+1);             sudoku[y][x] = 0;             }       }    } } int main(void) {    Solve(0);    return 0; }

  • 複雑なキャスト

    "(int の要素数3の配列) へのポインタ" を意味するキャストはどのような書き方になりますか? (int*[3]) かと思ったのですが、コンパイルエラーになります。 参考までに、ソースをのせておきます。 pai や ai のようなよくわからない変数名は、 型が複雑なためそこだけハンガリアン記法っぽく書いています。 #include<stdio.h> // func は int の要素数3の配列 {0, 1, 2} の中の n 番目の要素を返す int func(int (*pai)[3], int n){ // pai means 'p'ointer to 'a'rray of 'i'nt. return (*pai)[n]; } int main(){ int ai[] = {0, 1, 2}; // ai means array of int. int i = func(&ai, 1); // 同じことを、先頭要素のポインタを経由してやりたい int *pi = &ai[0]; // pi means pointer to int. int j = func((int*[3])pi, 1); // "(int の要素数3の配列) へのポインタ" を // 意味するキャストがしたい // (int*[3]) ではエラーになる printf("Of course %d = %d.\n", i, j); return 0; }

  • 三次元配列の動的メモリの確保?

    const int SLICE=2; const int SIZE=256; signed short int *matrix=new signed short int[SLICE][SIZE][SIZE]; for(int i=0; i<SLICE; i++){ for(int j=0; j<SIZE; j++){ for(int k=0; k<SIZE; k++){ fin.read((char*) &matrix[SLICE][SIZE][SIZE],sizeof(signed short int)); } } } delete[] data; 三次元データを読み込むために、三次元配列を使って読み込もうとしたのですが、上手く読み込めません。 三行目の所で、error C2440: '初期化中' : 'short (*)[256][256]' から 'short *' に変換できません。 七行目の所で、error C2109: 配列または、ポインタでない変数に添字が使われました。 というエラーがでます。動的メモリの確保の仕方がまずいのでしょうか? どなたか教えて頂けますでしょうか?よろしくお願いします。

  • このコードは省いてもよいのでしょうか?

    下記のプログラムは2行3列の行列と3行2列の行列の積を求めるものです。 int main(void) { int i, j, k; int mx[2][3] = {{1, 2, 3}, {4, 5, 6}}; int my[3][2] = {{1, 5}, {5, 3}, {8, 1}}; int mz[2][2] = {0}; for(i=0; i<2; i++) { for(j=0; j<2; j++) { mz[i][j] = 0; for(k=0; k<3; k++) mz[i][j] += mx[i][k] * my[k][j]; } } for(i=0; i<2; i++) { for(j=0; j<2; j++) printf("%3d", mz[i][j]); putchar('\n'); } return (0); } 【質問】 main関数冒頭で int mz[2][2] = {0}; と初期化されていますが、後に出てくるforループ中の mz[i][j] = 0; は結局同じことをして無駄なコードではないのでしょうか? このコードを省いたプログラムをコンパイルして実行しても結果には影響ありませんでした。 とはいえ、考えが合っているか不安なので回答よろしくお願いします。

  • for 文における処理の改善(C言語プログラム)

    はじめまして。panicdjです。 いまCでプログラムを組んでいます。 環境はVC++ver6.0 Win32 Console Applicationです。 以下のプログラムを見てください。 #define X_MAX 10 #define Y_MAX 20 #define Z_MAX 5 int main(int argc , char ** argv) { int i, j, k; int aa[10][20][5]; for (i = 0; i < X_MAX; i ++) { for (j = 0; j < Y_MAX; j ++) { for (k = 0; k < Z_MAX; k ++) { aa[i][j][k] = 10.0; } } return 0; } 過去のスレッドでポインタ型によるアクセスを すれば、処理が高速になるとかかれていました。 自分は,for文による繰り返す処理ではなく, その「ポインタ型によるアクセス」を実装したいのです。 こんな私にアドバイスお願い致します。

  • コンパイル後のエラー。

    こんにちは、質問があります。 下のプログラムを組みました。 コンパイルには成功しましたが、実行することができません。 import java.io.*; public class Gyouretu { public static void main(String[] args) { BufferedReader reader = new BufferedReader( new InputStreamReader(System.in), 1); try{ System.out.println("行列数を入力"); String line = reader.readLine(); int n = Integer.parseInt(line); int a[][] = new int[n][n]; int b[][] = new int[n][n]; int c[][] = new int[n][n]; int i,j,k; for ( i = 0; i < n; i++){ for ( j = 0; j < n; j++){ c[i][j]=0; for ( k = 0; k < n; k++){ c[i][j] += a[i][k] * b[k][j]; System.out.print(c); System.out.print(i); System.out.print(j); } } } }catch (IOException e){ System.out.println("end"); } } } 行列の計算をするプログラムなのですが、コンパイル後に行列数(何行何列か?)を入力するとこんなエラーが出ます。 「'2' は、内部コマンドまたは外部コマンド、  操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 なぜなのか、どうしてもわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java