- 1 :デフォルトの名無しさん:2008/07/27(日) 10:47:14
- int i = 10;
int * p = &i;//int型ポインタpにiのアドレスを代入する
簡単。
char str1[] = "abcde";
char * str2 = "abcde";
上と下は同じでどっちを使ってもいい。 - 6 :デフォルトの名無しさん:2008/07/27(日) 11:25:57
- * を両方から離して書くのは
かけ算と紛らわしいので嫌い - 230 :デフォルトの名無しさん:2008/10/04(土) 12:01:50
- char str1[] = "abcde";
char * str2 = "abcde";
>上と下は同じでどっちを使ってもいい。
これは間違い。str1は書き込みできるが、str2は書き込みができないことがある。 - 231 :デフォルトの名無しさん:2008/10/04(土) 12:19:38
- >>230
どっちも書き込めないときがあるだろ。
パソコン上ではどちらも書き込めるが、
ROM化環境などではどちらも固定される事がある。
これらの最大の違いは、sizeof(); で返される値。
char str1[] = "abcde";
char * str2 = "abcde";
printf("%d�\n",sizeof(str1));
printf("%d�\n",sizeof(str2));
やってみそ - 239 :デフォルトの名無しさん:2008/10/04(土) 13:18:31
- char s[] = "abcde";
ポインタ経由だと、これに書き込めない環境があるってこと?
ないだろ。 - 246 :デフォルトの名無しさん:2008/10/04(土) 13:44:29
- 知ったかでしゃべってるのを「分野の違い」にすんなよ。
>>239 が、ポインタ経由だと書き込めないってどんな処理系だよ。 - 247 :デフォルトの名無しさん:2008/10/04(土) 13:50:24
- >>246
だからさ、世の中には色んなコンパイラがあって、色んな環境で色んなCPUが色んな場所で動いてるわけよ。
その全部のローカルな俺様コンパイラ的な物では定数は全部固定データなワケよ。
特に初期化宣言以降どこに右辺に現れない変数も固定な訳よ。 わかる? - 249 :デフォルトの名無しさん:2008/10/04(土) 13:55:33
- >>247
定数を書き込み禁止領域に置くコンパイラってこと?
それごく普通のコンパイラじゃん
文字列リテラルを書き換えようとして落ちるのはANSI仕様上も問題ない
知ったか乙 - 253 :デフォルトの名無しさん:2008/10/04(土) 13:59:13
- >>249
だからさ、
char t[] = "abc";
t[0] = "0";
とかあれば、このtは書き換え出来る領域に"abc"をコピーしてくるけど、
char t[] = "abc";
char *p;
p = &t[1];
*p = "0";
とかすると、落ちるとか普通にある訳よ。 - 259 :デフォルトの名無しさん:2008/10/04(土) 16:33:17
- >>231
> パソコン上ではどちらも書き込めるが、
> ROM化環境などではどちらも固定される事がある。
知ったか乙
汎用OS下でも処理系によって違うんだよ。
そもそもANSI読んだのか? - 318 :デフォルトの名無しさん:2009/02/04(水) 11:04:42
- ポインタの記号ってドルマークの方が良かったと思う
アスタリスクだと掛け算とごっちゃになるから嫌いなんだよ - 320 :デフォルトの名無しさん:2009/02/04(水) 14:20:23
- a*=b と a=*b とか
a**b とかじゃないの? - 323 :デフォルトの名無しさん:2009/02/05(木) 08:40:05
- >>318
>>6
>>320
大昔のHP-Cで =* という独自拡張された演算子
(*= と同じなんだけど、式の値は演算“前”の左辺) があって
a=*b なんて書くと「ambiguous だぜ。演算子の後ろに空白入れな。」
という警告をくらったのを思い出した。
bがポインタかどうかで判断つくだろうに。
つか、誰が得するんだあの拡張。 - 326 :デフォルトの名無しさん:2009/02/05(木) 13:42:15
- > > =* の類は「独自拡張」じゃないぞ。
> mjsk
こんなことも知らん割には、ずいぶん上から目線だな。 - 362 :デフォルトの名無しさん:2009/09/01(火) 02:43:45
- 超初心者の質問ですが、いいですか?
int v,*po;
po=&v;
*po=300;
のように、ポインタ変数poが指す内容は変数vのアドレスである、ということですが、
char *jk;
jk="jyosikousei";
のように、ポインタの中に文字列を直接入れられるのはどうしてですか?
この場合、ポインタ変数jkは'j'の文字が格納されているアドレスを指しているということでしょうが、なぜそこに文字列"jyosikousei"を直接代入できるんですか? - 406 :デフォルトの名無しさん:2010/01/24(日) 17:31:42
- そもそも配列概念の実装がポインタ演算なんだから
- 510 :デフォルトの名無しさん:2011/06/08(水) 20:26:32.43
- ポインタがマジでわかりません。
int * const (*(*funcsMap[FUNCS])())(int * const (*)());
はがしたいのでしょうか? - 526 :デフォルトの名無しさん:2011/06/10(金) 22:11:06.55
- int *p;
p= (int*)malloc(80);
として、
pp[1][2] = 2;
とできるには、ppをどの様に宣言すればいいですか? - 582 :デフォルトの名無しさん:2011/08/28(日) 13:06:04.38
- 大体何でぇ、変数の名前で指定すれば事足りる物をわざわざアドレスを取り出して
それを指定するのか、そこが分らん。
確かに世の中氏名と出席番号有るのは分かるんだが、それがプログラムの世界で
なんで必要なのかがわからんのよ - 587 :デフォルトの名無しさん:2011/08/31(水) 10:31:12.12
- int *p = 0;
*p = 0;
この違いを理解できずに打ちのめされる初心者カワイソス - 655 :デフォルトの名無しさん:2012/02/16(木) 18:16:31.69
- 「JavaやC#にはポインタが無い」(※JNIやunsafe除く)
って言葉だけだとちゃんと分かってるのか判断出来ないよな
「参照はあるけどCのようなポインタは無い」とか
「ポインタ演算は無い」のような表現なら分かるけど - 656 :デフォルトの名無しさん:2012/02/16(木) 19:48:27.25
- >>655
>「参照はあるけどCのようなポインタは無い」
言語ごとに「ポインタ」の定義が違うことを
ちゃんと分かってるのか判断出来ないよな?? - 687 :デフォルトの名無しさん:2012/02/25(土) 12:49:27.76
- int a = 1234
だとして、
&a とすれば、1234が記録されてるメモリー番地(たとえば4567等)が読み取れる。
&記号は 通常の変数に対して使えるのだから、*記号も同様に使えればシンプルで良かった。
*a とすれば、メモリー番地1234に(バキューン!)できる。これで十分じゃないか?
しかし実際はエラーになる。
通常の変数に * は使えない。
ポインター変数である int* a も、結局、実体はただの4byte長の数字を格納してる変数にすぎない。
通常の変数との違いは
適用できる記号が &(記録に使われてるメモリー位置を得る) だけの通常変数と、
&以外に *(記録されてる数字の、メモリー位置から読み書きする)も使えるポインタ変数。この違いだけ。
通常変数も、ポインター変数も無関係で、何にでも & と * を使えるようにすればシンプルで良かった。アセンブラの場合はこれ。
「アセンブラから始めればポインタを理解しやすい」と言われる理由はここにある。 - 689 :デフォルトの名無しさん:2012/02/25(土) 14:16:08.68
- そもそも通常変数とポインタ変数と言う区別をしているからいけない。
その、ポインタ変数と言う代物は只単にポインタ型の変数でしかない。
つまりそれは、通常変数と言う代物と型が違うだけの同じものだ。 - 690 :デフォルトの名無しさん:2012/02/25(土) 14:18:44.29
- >>689
ポインタを実際に使ってない人のコメントにしか見えない - 706 :デフォルトの名無しさん:2012/02/25(土) 19:55:21.07
- #include <stdio.h>
static void function(int a)
{
printf("my_function: %d\n", a);
}
static void caller(void (*new_function)(int a), int p)
{
(*new_function)(p);
}
int main(void)
{
caller(function, 10);
return 0;
} - 708 :デフォルトの名無しさん:2012/02/25(土) 21:14:14.64
- >>706
>static void caller(void (*new_function)(int a), int p)
これをプロトタイプ宣言すると
static void caller(void(*)(int), int);
となるわけで、初学者には恐怖感あるだろうな。 - 731 :デフォルトの名無しさん:2012/03/05(月) 00:30:34.32
- Javaの意味での参照では不十分で、Cの意味でのポインタが必要なのはどんなとき?
外部関数呼び出しインターフェースをつくるときくらいしか思いつかない。 - 752 :デフォルトの名無しさん:2012/03/08(木) 05:59:12.20
- DataGridViewでクラスのメンバ変数一覧みたいなのを作って
変数とセル内容を対応させるみたいなの作るときにポインタないと辛い
クラスは参照でいけんだけどint bool floatとか値型?のもんってポインタないから氏ねる - 754 :デフォルトの名無しさん:2012/03/08(木) 10:45:05.68
- >>752
グリッドとかでメンバ変数への直接の参照を保持することって無くない?
http://ideone.com/hhkJX
それとも行エントリ自体が値型ってこと? - 755 :デフォルトの名無しさん:2012/03/08(木) 12:12:36.09
- 上で出てきた人だよね? まだそんなことやってんの?
さすがにポインタ以前の理解力の問題なんじゃないか
上で言われてるようにリフレクション使えば何の苦もないし
値型もObjectに入るはずだけど何が問題なのかわからない - 756 :デフォルトの名無しさん:2012/03/08(木) 12:18:38.54
- もしかして*(cells[1,2])=4;みたいな感じでメンバ変数を更新したいってこと?
そんなことしなくても変数名分かってんだからリフレクションで書き換えればいいだろ - 757 :デフォルトの名無しさん:2012/03/08(木) 23:37:08.86
- >>755
>上で言われてるようにリフレクション使えば何の苦もないし
なんの苦もなくは嘘だろ
すげー大変だった
これだったら絶対ポインタあったほうがいいよ
配列かどうかまで判断しないといけないとこも氏ねる
実行時型情報はあくまで型だけでインスタンスを特定できるもんじゃないんだよね
つまり、特定するにはどこどこのだれだれの~って上からたどってこないと氏ねる
>>756
ちげーよ
DataGridViewで特定の変数にアクセスしたいって言ってるのになんで別の例を出すんだ
変数名わかってもどこのインスタンスの(配列のN番目という可能性もあり)どのメンバのなかのこのメンバの12番目の要素
とかいうとこまでとってこないといけなくて面倒だろうが
ポインタだったら格納時にアドレスだけ保持って「ハイ、終了」だろが - 758 :デフォルトの名無しさん:2012/03/09(金) 00:16:46.63
- >>757
ポインタだったら簡単とか言ってるけど
そのポインタの型情報はどのように取得するの?
泥臭く手書きで網羅するの?
デバッグ情報として埋め込むの?
int*とか決め打ち?
リフレクションがどういうものなのか
理解出来ていないのでは? - 759 :デフォルトの名無しさん:2012/03/09(金) 00:22:48.79
- >>758
リストにこっそり入れときゃいいじゃん
Visible falseで
リフレクションだと俺がやった感じだとあくまで型しか取得できなくて
ポインタっぽいことはできない感じだったな
できる方法があったら教えてくれ
配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ - 760 :デフォルトの名無しさん:2012/03/09(金) 00:38:07.85
- >>759
>リストにこっそり入れときゃいいじゃん
めんどくせぇよw
てか、用途が分からん例えでイメージしづらい
> 配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
ポインタでも同じでしょ
てか、配列をポインタで管理すると
型情報の他にもしくはNULL終端縛りかlengthまで必要になるよね - 761 :デフォルトの名無しさん:2012/03/09(金) 01:20:35.81
- >>760
同じじゃないって
リフレクションが持ってるのは型だけなんだって
馬鹿でもわかるように説明すると
void* p = &unko[12];
こういう情報をとれない
>てか、配列をポインタで管理すると
そんな話してない
DataGridViewのセル1つが変数1つに対応してる形だ
こっちが挙げてる例からなんで脱線するようなことをいうんだ
お前、ツカエネー奴だろ
会議でいっつも関係ないことを発言しだす不思議ちゃんだろ
正直、邪魔だからw - 764 :デフォルトの名無しさん:2012/03/09(金) 02:31:06.14
- >>761
> リフレクションが持ってるのは型だけなんだって
void*で受けたら型すら分からんですよ
型が分かれば十分じゃない?他に何が必要なの?
> void* p = &unko[12];
> こういう情報をとれない
即値な理由もunkoの型も使い所もpの寿命も…
何が言いたいのか分かんない
> >てか、配列をポインタで管理すると
> そんな話してない
>> 配列なのかそうじゃないのかとか判別して・・・ってやるのすごく面倒だったんだ
してるじゃん
> DataGridViewのセル1つが変数1つに対応してる形だ
言ってる意味は分かるよ
型が決め打ちってことはないだろうから
デバッガのGUIフロントエンドにありがちのtreelistではなく
tree + listのツーペインのlist部分みたいな位置づけでしょ?
で、リフレクションありとなしでは手間が違うって言ってるの
バインドや取得
どう考えてもめんどくさいよ - 766 :デフォルトの名無しさん:2012/03/09(金) 06:25:18.09
- >>764
超馬鹿だなお前
わかりやすい例出してやったのに
型がわかってもunkoの12番目っていう12番目ってところを保存できねーだろが
本当にカスだなお前
ってか、お前がリフレクション使ってなんにもやったことがないのはわかった - 767 :デフォルトの名無しさん:2012/03/09(金) 08:56:18.85
- >>766
>>754のソースじゃ駄目なの?
あとこういうのは?
http://ideone.com/nrlQw - 772 :デフォルトの名無しさん:2012/03/10(土) 01:14:26.00
- >>767-768
お前、人の話聞く気ないならわざわざクビ突っ込まないほうがいいぞ - 776 :767:2012/03/10(土) 18:32:08.71
- >>761
>リフレクションが持ってるのは型だけなんだって
型だけでなくどのクラスのどのメンバって情報持ってるよ
>void* p = &unko[12];
>こういう情報をとれない
ICell c = Bind(et.na, 12); で情報を保存出来てるよ
配列でないメンバも同様
ICell c = Bind(et, "n");
構文は関係無いよね?
>>764
>unkoの12番目っていう12番目ってところを保存できねーだろが
同上
>>772
認識は上に書いた通りなんだけど
出来れば具体的に指摘して欲しい - 777 :デフォルトの名無しさん:2012/03/10(土) 19:16:42.40
- >>776
え?そんな特定の型限定のソース出されて言われても困るんだけど - 788 :営利利用に関するLR審議中@詳細は自治スレへ:2012/03/29(木) 17:46:26.00
- 変数を指す変数があれば便利な場合がある
そんだけ
配列とかと同じ - 789 :営利利用に関するLR審議中@詳細は自治スレへ:2012/03/29(木) 17:50:24.84
- 必要性とかわりとすぐピンときたけどなw
関数に配列の先頭アドレス渡すのって合理的じゃね?
変数のサイズ、構造体のサイズってのを理解している段階であれば分かるはず。 - 792 :営利利用に関するLR審議中@詳細は自治スレへ:2012/03/30(金) 00:53:28.26
- BMPみたいな数MB単位の巨大配列とかいじるとき、ポインタなしだとやってられんでしょ
動画だったらこれをさらに数十枚分キャッシュとかが普通なわけで
まあ、せいぜい数KB程度の配列や構造体しか扱ったことのない者には、なかなかありがたみはわからんかもね - 797 :営利利用に関するLR審議中@詳細は自治スレへ:2012/03/31(土) 12:16:00.08
- >>788
>>789
>>792
おまえらが言ってるのはただの「参照」。
そんなのはjavaやその他の言語にもある。
ていうか配列を丸ごとコピーする実装の言語なんてたぶん無いw
ポインタが難しいのはそこじゃないことを判りもしないで恥ずかしいレスすんな。 - 799 :営利利用に関するLR審議中@詳細は自治スレへ:2012/04/01(日) 08:24:48.19
- 教えて欲しいなら憎まれ口叩くより素直に教えてくださいって言った方が得だよ
- 808 :営利利用に関するLR審議中@詳細は自治スレへ:2012/04/02(月) 12:28:21.19
- >>799
ポインタのどこが難しいのかどうか教えて下さい。お願いします
スレタイ同様、私には「ポインタを難しいと言う奴が理解できない」ので - 811 :営利利用に関するLR審議中@詳細は自治スレへ:2012/04/03(火) 08:48:18.31
- >>808
断片的に何度か書いているが、もっかいまとめてみる。
まず参照だ。コードの例で示してみる。
void func_a() {
OBJ a = new OBJ[10000]; //でっかい配列
func_b(a); //関数内では参照している
//なんかの処理
//ここでaは不要になるので、コンパイラは自動的に解放処理を呼び出す
}
void func_b(OBJ b) {
//なんかの処理
//ここでbは不要になるので、コンパイラは自動的に解放処理を呼び出す
}
こんなコードがあったとする。func_bにはaの参照を渡している。
ここで大事なのはaとbの解放タイミングがわからない点だ。どちらかの処理が済んでないのに、もう片方を解放したら落ちてしまう。
さて、参照とポインタの違いは「参照ならポインタ以外のワークも共有できる」という点だ。この場合ならbに渡す時に、「この変数は2箇所で使われている」という情報を書き込むことが出来る。
それにより、aおよびbの解放時に、じかに解放するのでなく、「使われている回数を1引き、0になったら解放する」という処理に変えることで、安全に解放処理を呼び出すことができる。
ポインタではそうはいかない。func_bに渡されるのはaかもしれないし、&a[1]かもしれない。するとワークは渡せないので、もちろんfunc_bで解放することはできない。すると解放処理をプログラマにやらせるしかない。
だからfree関数が用意されている。しかし上記のケースでは、func_aがfunc_bより先に終わるかもしれないから、安易にfunc_aの末尾でfree(a)などとやったら落ちてしまう。これがポインタの難しいところだ。 - 821 :営利利用に関するLR審議中@詳細は自治スレへ:2012/04/04(水) 12:38:38.24
- 811の翻訳(エスパー)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
void* f(void* a) {
sleep(1);
printf("%d\n", *((int*)a));
}
g() {
int* a = malloc(sizeof(*a));
*a = 123;
pthread_attr_t pta;
pthread_attr_init(&pta);
pthread_attr_setdetachstate(&pta, PTHREAD_CREATE_DETACHED);
pthread_t pt;
pthread_create(&pt, &pta, f, (void*)a);
free(a);
}
main() {
g();
sleep(2);
}
http://toro.2ch.net/test/read.cgi/tech/1217123234/l50/../人気ブログランキングへ