- ベストアンサー
ポインタの意味がわからず困っているのですが、ポインタとは何ですか?
- ポインタはメモリのアドレスを格納する変数であり、他の変数のアドレスを指すことができます。
- int型の変数aとint型のポインタ変数bを宣言した場合、aの値はアドレス10に、bの値はアドレス20に格納されます。
- b = &a;とした場合、bの値にはaのアドレス10が格納されます。また、b = 30;とした場合、bのアドレス20に値30が格納されます。
- みんなの回答 (6)
- 専門家の回答
関連するQ&A
- ポインタ変数を変数に渡す方法
(int * 型)ポインタ変数に代入されたアドレスを、(普通の)int 型変数に代入したいのですが、どのようにするのが正しいのでしょうか。 想定しているケースは、与えられたメモリ番地に対して、アドレスオフセットを加えるなどの操作を施して「補正アドレス」を生成し、メモリアクセスを行う、というような特殊な操作を実現するような場合です。 ※ メモリ番地がポインタ宣言で与えられる、という制約があります。 以下サンプルプログラムを書きました。組み込み系のプログラムを記述していますが、これで正しいでしょうか。 unsigned int *p, *p1; // ポインタ変数宣言 unsigned int value; p= (unsigned int *)0x00001F00; // メモリの0x1F00番地 value = p; // <-- ここが心配 value |= 0xCC << 16; // 与えられたアドレスから value &= 0x4 << 12; // 「補正アドレス」生成 p1 = (unsigned int *)value; *p1 = 0xA5A5_A5A5; // 「補正アドレス」にA5A5... をライト C言語初心者で、いろいろなサイトを見てみたのですが、説明されているページが見つからず質問させていただきました。どうぞよろしくお願いします。
- ベストアンサー
- C・C++・C#
- ”int *a,*b”というポインタ変数宣言した値でa=&bということ
”int *a,*b”というポインタ変数宣言した値でa=&bということはできる? ”int *a,*b”このような変数をグローバル宣言した場合、 a=&bというようなことはできるのでしょうか? ”int *a,*b” この宣言で、 aが10番地 bが20番地に定義されたと仮定しています。
- ベストアンサー
- C・C++・C#
- ポインタ変数とポインタのポインタ
ポインタ変数の宣言 char *a[]; をしたとき僕の中では a[0],a[1]...という、ある文字列A,B,C...の最初のアドレスを指すポインタが、配列になっているものを宣言していると理解していました。 しかしこの次に、ポインタのポインタが出てきました。僕はこれを、 ある変数を指し示すアドレスのアドレスである、と理解しました。 この2つは1つめはいくつかのアドレスを指し示すもの、2つ目は1つのアドレスを指し示すものであるとして、僕の中で異なったものであると理解していましたが、参考書「C標準コースウェア」によると プログラムにおいて、関数でポインタ配列を受け取るときchar *p[]はchar **pとしてもよい と書かれており、またその実例として、 (9-5) #include <stdio.h> void disp (char *p[],int n){ int i; for (i= 1;i<n;i++){ printf("%s\n",p[i]); } } int main(void){ char *girl[] = {"Arica","Candy","Lisa"}; disp (girl,sizeof(girl)/sizeof(girl[0])); return 0; } というプログラムが書かれていました。 ここで一気に訳が分からなくなりました。 char *girl[] = {"Arica","Candy","Lisa"}; と宣言されているため、 girl[0]はAricaという文字列の最初のアドレスを指すポインタ、 *girl[0]はAricaという文字列を直接指し示していると解釈しています。 girlは{"Arica","Candy","Lisa"}という文字列の配列の最初のアドレスを指し示していると考えました。 sizeof(girl)を使った時に不思議なのですが、 girlはどのように配列の終わりを理解しているのでしょうか? (配列の要素数を渡していない点が不思議です。) また、 disp側が受け取ったのは*girl[]であり、いくつかのポインタの配列ですが、渡したものはgirlという要素数がないポインタ1つだけです。 そして最初の疑問が出てくるわけですが、*p[]を**pと書きかえてみると、 文字列のアドレスを示すgirlという名の1つのポインタを渡すと、pという名のポインタのポインタで受け取るというのも、よくわからなくなっています。 おそらくポインタ配列に対する理解がどこかでずれているようですが、自分でどこがわからないのかわからなくなっています。 どうかご教授ください。
- ベストアンサー
- C・C++・C#
- 変数
ポインタ変数なんですが、 int *p;と宣言した時 自分自身のアドレスを持ってますか?(プログラムが終わるまで?) ポインタ変数は、他の変数アドレスを格納しますよね。 また数値の値も格納しますよね。 これは、ポインタ変数宣言 時の自分のアドレスに、 他の変数のアドレス、数値の値、 と二つを格納しているのですか? ポインタ自身のアドレス出力は(int *pの時) printf("%p",&p); 他の変数のアドレス出力は(p=&の時) printf("%p",p); であってますか? 普通の変数は、自身のアドレス、数値の値、だけ、 ポインタ変数はさらに、他の変数の値を格納していますか? 教えてください。
- ベストアンサー
- C・C++・C#
- ポインタの基礎的なこと
#include <stdio.h> int main() { char *a; *a='X'; printf("%c\n", *a); return 0; } 実行すると、"X"がきちんと出力されるんですが、 この場合"X"という文字が格納されている場所(ポインタが指し示している場所)は、メモリが確保されていないので、もっと長いプログラムになった場合に、この"X"が格納されている場所は、ほかの変数の領域に割り当てられたりして使われてしまう可能性があるということなんでしょうか?
- 締切済み
- C・C++・C#
- ポインタのポインタが引数にある関数の使い方。
ポインタのポインタが引数にある関数の使い方。 現在、このポインタのポインタが引数にある関数の動きがわからず困っています。 int test(int ** head) { int * pTail = (int *)*head; pTail = pTail + 1; } もし、この関数を呼び出して使用した場合どのような動きをするのでしょうか? int * comm_msg; これをグローバルポインタ変数として宣言させて、 test((void **)&comm_msg); このように呼び出したとした場合とさせていただきます。
- ベストアンサー
- C・C++・C#
- 複雑なポインタの定義
#include <stdio.h> typedef int *(*i[3])[2]; int main() { int a = 0; int b = 1; int c = 2; int d = 3; int e = 4; int f = 5; int *u[2] = {&a, &b}; int *v[2] = {&c, &d]; int *w[2] = {&e, &f}; int **pp[3] = {u, v, w}; /* arrayをi型(intへのポインタを要素とする2個の配列へのポインタを要素とする3個の配列)として宣言 */ i array; /* この部分でarrayを使って変数a~fの内容を表示したい */ } 上記の最後の部分で、typedefで定義したi型の変数arrayを使って、変数a~fの内容を表示させたいのですが、その上で定義している諸々の変数との型の不整合が起こって、どういう記述をしたらよいか分かりかねています。要は、複雑なポインタの型定義をした場合の使い方がよく分からないのです。 御経験のある方は、御教示願えれば助かります。
- ベストアンサー
- C・C++・C#
お礼
回答頂きありがとうございました。1つ1つ答えて頂きたすかります。 >(5)b = &a >少し違います。*b = 30; これならご説の通りですが 確かに”*b = 30”にしなければいけないですね。 ふと疑問に思ったのですが、 //b = &a これをせずに、 *b = 30 とやってしまった場合、プログラムはどのような動きをするのでしょうか? int *b; と宣言した場合、*bのメモリアドレスには何か決まった値は入っているのでしょうか?