ポインタはどうやって ..
237:デフォルトの名無しさん
07/11/06 15:17:15
>>236
いろいろわかってなさ杉
238:デフォルトの名無しさん
07/11/06 15:29:44
初心者だけど
>>233
のコードが実行できると
どっかのメモリに10が代入されるってことなのか?
239:236
07/11/06 15:34:16
>>237
ポインタのサイズは指している型に関わらず同じ、なんてことは無かったような気がするんだけど
間違ってる?
240:デフォルトの名無しさん
07/11/06 15:34:21
aに10が入る
241:デフォルトの名無しさん
07/11/06 15:37:47
>>239
ポインタはint型のサイズと同じって記憶があるけど。
242:デフォルトの名無しさん
07/11/06 15:37:55
>>239
ポインタのサイズが型によって違う処理系教えてくれ
243:デフォルトの名無しさん
07/11/06 15:47:56
>>238
doubleにintポインタのアドレスを入れるけど、
doubleの値をintポインタにキャストしてるから、
結局int aに値を入れてるのと同じ。
244:デフォルトの名無しさん
07/11/06 15:48:44
>>243
語弊があるな、intのアドレスをdoubleの値に入れる。かな
245:デフォルトの名無しさん
07/11/06 15:55:40
>>243
なるほどね、読み返して見たら納得できた。
246:236
07/11/06 16:24:31
どっかで見た気がしたんだが記憶違いだったか
しかし、void*とかmallocとか考えるとありえないなorz
スレ汚しすまんかった
247:デフォルトの名無しさん
07/11/06 16:48:26
>>241
それはない
248:デフォルトの名無しさん
07/11/06 16:59:09
>>241
そういう場合もある
249:デフォルトの名無しさん
07/11/06 18:25:36
現状そういう処理系が実在しないにしても
規格上はint *とdouble *が安全に変換できるとは限らない
void *を介しても同じ事
250:デフォルトの名無しさん
07/11/06 18:37:14
昔々、ポインタにはfarとnearがあっての…
251:デフォルトの名無しさん
07/11/06 19:33:07
ポインタなんて今時覚える必要ないと思う。
C#とかポインタを気にせずプログラミングできる言語が主流になりゃいい。
今後PCはどんどん高性能化していって統合環境が整うんだからポインタみたいな
危険な構造、なくしてけばいいよ。
そういうのはコンパイラに任せとけ。
252:デフォルトの名無しさん
07/11/06 21:20:12
例えば貴方の身の回りの家電や車の制御プログラムにC#を入れるとな?
こういうマイコンは限られたメモリをいかに容量的に効率的に高速に使うかが大事
253:デフォルトの名無しさん
07/11/06 21:24:25
>>252
ただ現実にはそういう方向かもね。携帯とか Java 走ってる。
あと、C 使いこなすにはポインタ理解する必要はあるけど、
必要以上にポインタを使い回す事はない。パフォーマンスが
心配なら実際 profiling してから直すべき。
ついでに、あまり複雑なことをしなけりゃポインタも簡単。
254:デフォルトの名無しさん
07/11/06 22:10:34
Javaとかにも、配列の途中からを指す方法があればなあ
配列そのものと、何番目かをあらわすIndexと。二つ渡すのが非常にかっこわるい
255:デフォルトの名無しさん
07/11/06 22:13:04
SubList使えよ
256:デフォルトの名無しさん
07/11/06 22:36:26
携帯Javaにはそんな便利なもんねえ
257:デフォルトの名無しさん
07/11/07 06:26:59
>>251
C#、Javaはむしろポインタだらけじゃないか?
258:デフォルトの名無しさん
07/11/07 06:56:56
>>243
>doubleにintポインタのアドレスを入れるけど、
>doubleの値をintポインタにキャストしてるから、
>結局int aに値を入れてるのと同じ。
double*に入れるときは問題ないけど
doubleに入れるときはアドレス値がdouble値としてふさわしくないときに
正規化されて他の正しい浮動小数点数に変換されるだろうから
int*にキャストしたときには別の場所を指してる可能性があるね
259:デフォルトの名無しさん
07/11/07 07:39:19
そんな環境実際にあんの?
260:デフォルトの名無しさん
07/11/07 08:32:42
>>259
確かにその通り。正規化云々以前にポインタ値をdouble変数に入れられない。
261:デフォルトの名無しさん
07/11/07 08:39:01
どうせ二進表現の数なんだから、ビット幅さえ合えば入れられるんじゃないの?
数値としては別な物になるだろうけど。
262:デフォルトの名無しさん
07/11/07 10:38:38
>>261
つ[規格]
263:デフォルトの名無しさん
07/11/07 11:06:58
アセンブラをやれ でFA?
264:デフォルトの名無しさん
07/11/07 14:24:27
>>261
longに入れたりintに入れたりは幅だけ合ってれば出来るけど
doubleの場合は規格化された値しか入れられないよ
265:デフォルトの名無しさん
07/11/07 14:27:32
>>261
union {
double d;
int *p;
} hoge;
hoge.p = (int *)-1;
printf("%f", hoge.d);
これやってみ
266:デフォルトの名無しさん
07/11/07 19:32:13
なんていうか
無理に1000いくまで議論しなくてもいいと思うんだ・・・
267:デフォルトの名無しさん
07/11/07 21:15:55
関数ポインタ
int func(int a) {
return a*2;
}
main(){
int (*p_func)(int);
p_func = func;
(*p_func)(2); //実行方法
}
268:デフォルトの名無しさん
07/11/07 21:25:14
関数へのポインタだろ
269:デフォルトの名無しさん
07/11/07 21:25:29
関数へのポインタへのダボーポインタだろ
270:デフォルトの名無しさん
07/11/07 22:42:55
これは何ですか?関数配列へのポインタ?関数へのポインタの配列?
void (*p_funcs[])(void) = {funca, funcb};
271:デフォルトの名無しさん
07/11/07 22:43:34
ポインタの配列
int* ponta[10];
int配列へのポインタ
int(* ponta)[10];
272:デフォルトの名無しさん
07/11/07 22:45:56
これだと関数の戻り値へのポインタなのか誰か関数とかまとめて
void *func(void);
273:デフォルトの名無しさん
07/11/07 22:51:54
関数って配列にできるんですか
274:デフォルトの名無しさん
07/11/07 22:55:31
関数配列の戻り値へのポンタ
int *ponta[10];
275:デフォルトの名無しさん
07/11/07 23:49:29
// 関数ポンタ配列
#include <stdio.h>
typedef int (*pKANSUU)(int);
int pontax0(int ponta){
return ponta-ponta;
}
int pontax1( int ponta ){
return ponta;
}
int pontax2(int ponta ){
return 2*ponta;
}
int main(){
pKANSUU ponta[3]; //int (*ponta[3])(int);
ponta[0] = &pontax0;
ponta[1] = &pontax1;
ponta[2] = &pontax2;
printf("x0: %d, x1: %d, x2: %d\n", (ponta[0])(100), (ponta[1])(100), ponta[2](100) );
return 0;
}
276:デフォルトの名無しさん
07/11/07 23:55:36
なんか変なレスが混ざってるんだが、わざとやってるのか?
277:デフォルトの名無しさん
07/11/08 00:00:13
なんか間違ってね?
278:デフォルトの名無しさん
07/11/08 00:05:54
>>270の答えは何ポンタ?
279:デフォルトの名無しさん
07/11/08 00:06:44
関数配列ってなに
280:デフォルトの名無しさん
07/11/08 00:14:16
>>279
つ kannsuuhairetsu[] = {kannsuu0, kannsuu1, kannsuu2,......};
281:デフォルトの名無しさん
07/11/08 00:27:05
関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?
282:デフォルトの名無しさん
07/11/08 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。
283:デフォルトの名無しさん
07/11/08 01:17:09
余計ややこしくなった気もしますね
284:デフォルトの名無しさん
07/11/08 06:10:44
ジャンプテーブル
285:デフォルトの名無しさん
07/11/08 06:50:19
関数の戻り値へのポインタ
void *func(void);
286:デフォルトの名無しさん
07/11/08 06:52:01
関数の戻り値の型が不貞の時は
void func(void);
で宣言していいんですか?引数が不貞の突起も?
287:デフォルトの名無しさん
07/11/08 07:05:56
://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
288:デフォルトの名無しさん
07/11/08 07:49:01
>不貞の突起
なにやら面妖な……
関数の戻り値型は一致しないといけません。まぁ、呼び出し側で値を使わないなら何でも構いませんが。
引き数に関しては、プロトタイプ宣言するなら一致している必要が出てくるのでなしと宣言したらなしになるので、
宣言したくないならなし(void)書いてはいけません。
289:デフォルトの名無しさん
07/11/08 17:33:36
教えてください。
void swap_ptr(char **a, char **b)
{
char *temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
char *str_a = "ABC";
char *str_b = "123";
swap_ptr(&str_a, &str_b);
printf("str_a=%s str_b=%s\n", str_a, str_b);
return 0;
}
↑のは正常に文字列の入れ替えが出来ます。
ならば
void swap_ptr(char **a, char **b)
{
char *temp;
*temp = **a;
**a = **b;
**b = *temp;
}
にしたら先頭の一文字だけ交換されるのか・・・と思ったら、交換されない上Warningまで出ます。
何がおかしいのでしょうか?
290:デフォルトの名無しさん
07/11/08 17:35:09
さらに
void swap_ptr(char **a, char **b)
{
char *temp;
&temp = a;
a = b;
b = &temp;
}
にしたらコンパイルすらできません。この場合はaとbのスタック変数のメモリアドレスそのものを(物理的に)交換しようとしているからなのでしょうか?
291:デフォルトの名無しさん
07/11/08 17:39:22
あ、>>289はWarningは出ないけどコンパイル後実行させた時に
>『問題が発生したため、a.exe を終了します。 ご不便をおかけして申し訳ありません。』
という致命的なエラーで落ちます。
292:デフォルトの名無しさん
07/11/08 17:41:14
>>289の後者は、
void swap_ptr(char ** a, char ** b) {char temp = ** a; ** a = ** b; ** b = temp;}
でないと辻褄が合わない。
そもそもchar * temp; だけではポインタは初期化されていないので、* temp = ...; とした場合不正アクセスになる。
293:デフォルトの名無しさん
07/11/08 17:41:18
変数に入ってる具体的な数字をprintしてみればすぐわかる
294:デフォルトの名無しさん
07/11/08 17:42:52
更に、>290のように&演算子を使った値は右辺値なので代入ができない。
295:デフォルトの名無しさん
07/11/08 17:54:38
printしたらAが出ました。
printf("%c\n",**a);
296:デフォルトの名無しさん
07/11/08 18:03:22
アホかい。
297:デフォルトの名無しさん
07/11/08 18:10:38
&str_aを引数で受け取った場合、
char **a;
&a: ?
a: ?
*a: a配列全体を指すアドレス
**a: aの実体(1文字)
ローカル変数のスタックはどこにいった
298:デフォルトの名無しさん
07/11/08 18:13:38
&a: 文字列のアドレスのアドレス
a: 文字列のアドレス
*a: 文字列(文字配列へのポインタ)
**a: 先頭文字
299:デフォルトの名無しさん
07/11/08 18:14:52
>>292
その通りにやってもエラで落ちます・・
300:デフォルトの名無しさん
07/11/08 18:16:03
違った、
*a: 文字列(文字へのポインタ)
301:デフォルトの名無しさん
07/11/08 18:19:16
&a: ローカル変数a自身のアドレス
a: aの指すアドレス
*a: aの指すアドレスの中身(文字配列全体)を指すアドレス?
**a: aの指すアドレスの・・・?
302:デフォルトの名無しさん
07/11/08 18:31:24
まとめてみます
これでなんでエラーが出るんでしょう。
#include <stdio.h>
void swap_ptr(char **a, char **b)
{
char temp;
temp = **a;
**a = **b;
**b = temp;
}
int main(void)
{
char *str_a = "ABC";
char *str_b = "123";
swap_ptr(&str_a, &str_b);
printf("str_a=%s str_b=%s\n", str_a, str_b);
return 0;
}
予想される結果:str_a=1BC str_b=A23
現実:コンパイルは通るけど実行後何も表示されずに即エラー落ち
303:デフォルトの名無しさん
07/11/08 18:36:23
>>299
>292を使うには、main()でchar str_a[] = "ABC"などとしないといけない。
304:デフォルトの名無しさん
07/11/08 18:38:19
str_a[0]='1';
305:デフォルトの名無しさん
07/11/08 18:51:37
>>303む
char str_a[] = "ABC"; (引数&str_a)もしくは
char **str_a = "ABC";(引数str_a)で宣言すると
無事に"文字列"全体が交換されたんですけど、先頭文字だけでは無いんですね。何故か
306:デフォルトの名無しさん
07/11/08 18:53:48
いや、なんでもないです。>>305は無視してください
307:デフォルトの名無しさん
07/11/08 19:56:18
ポインタのポインタのポインタのポインタとか
ヘンタイじみたモノは使うのを辞めましょう
308:デフォルトの名無しさん
07/11/08 20:16:36
文字列リテラルを書き換えてはいけない
309:デフォルトの名無しさん
07/11/08 23:51:48
>>305
どうでも良いけど、警告でねーか?
引数とわたす値の型が違ってるんだし
全体が交換されたからといって
こんな間違ったポインタの使い方
なんの役にもたたねぇぞ
310:デフォルトの名無しさん
07/11/09 00:27:30
void main()
{
(*************printf)("hello\n");
}
これがコンパイルできるのはなぜですか?
気になって夜もろくに眠れません。
誰か教えて!!
311:デフォルトの名無しさん
07/11/09 00:31:10
寝なくていいよ
312:デフォルトの名無しさん
07/11/09 03:30:41
プ
313:デフォルトの名無しさん
07/11/09 22:13:25
void main()
{
(*************************************************************************************************************************************************************************printf)("hello\n");
}
これも出来たから大丈夫
314:デフォルトの名無しさん
07/11/09 22:16:57
URLリンク(local.joelonsoftware.com)
あなたが再帰アルゴリズムを数秒で書け、連結リストを操作するポインタを使った関数をホワイトボードに書くのと同じくらい早く実装できる大学3年生なら、私たちのニューヨークでのサマーインターンプログラムをチェックしてほしい! 申し込みの締め切りは2月1日だ。
315:デフォルトの名無しさん
07/11/09 23:25:03
つーかこれ通るんだから。
int main(void) {
1;
return 0;
}
316:デフォルトの名無しさん
07/11/10 00:39:09
main(){
('A')
}
317:デフォルトの名無しさん
07/11/10 01:41:07
懐かしい!!ポインタは面白いね
char *s1, *s2;
while (*(unsigned long long *)s2 = *(unsigned long long *)s1);
この超ドSなコピーとかやってみ?ほんとハラハラさせてくれるよね
318:デフォルトの名無しさん
07/11/10 01:45:28
s2++,s1++するの忘れた
ついポインタに目がいってしまいました
319:デフォルトの名無しさん
07/11/10 01:52:25
main(){
('A')マンドクセ
}
320:デフォルトの名無しさん
07/11/10 02:02:52
ボインたん (;´Д`)ハァハァ
321:デフォルトの名無しさん
07/11/10 02:21:33
(ポインタをメンバに持つ構造体)をメンバに持つ構造体へのポインタ
あたりの自己参照構造体が難しいのですが・・・どうすりゃいいんだ〜〜〜〜
322:デフォルトの名無しさん
07/11/10 02:28:14
struct Node
{
struct Node *pNext;
void *ptr;
};
自己参照構造体ってこんなんだっけ?
323:デフォルトの名無しさん
07/11/10 02:31:10
こんなやつ
自己参照構造体が苦手でよくソフ開受かったな俺
typedef struct _person {
int number;
char name[40];
struct _person *prev;
struct _person *next;
} person;
main() {
prson *p;
}
324:デフォルトの名無しさん
07/11/10 02:34:46
メンバで「struct _person」を使う理由はまだ宣言されていないから
「struct _person」を「person」という省略名で宣言したいが、
メンバの定義段階では、「struct _person」は定義済みだが未だ「person」は定義されていないため
「struct _person」というダミーの名前を使わないとコンパイルエラーになるからって奴。
325:デフォルトの名無しさん
07/11/10 02:42:48
typedefとか使わなくていいんじゃないかと思う今日この頃
C言語は今でも
struct _person {
int number;
char name[40];
struct _person *prev;
struct _person *next;
} ;
main() {
_person *p;
}
こういう書き方はだめなんだっけ?
326:デフォルトの名無しさん
07/11/10 02:48:13
>>325
だめ
そいつはC++でしかできない
327:デフォルトの名無しさん
07/11/10 02:57:55
>>326
そうなんかd
最近「C言語で開発」とか言われても、開発環境がC++だから
どこまでがCの仕様なのかわからなくなることがある
328:デフォルトの名無しさん
07/11/10 02:59:49
C++コンパイラ使ってベターCな開発するのはいいが、
その機能がCのものなのかC++のものなのかも理解して
いないような香具師らもウジャウジャいるから気をつけろ。
329:デフォルトの名無しさん
07/11/10 03:18:38
>>326
え??いいんじゃないの?
330:デフォルトの名無しさん
07/11/10 03:20:31
>>328
俺の事だ/(^o^)\
331:デフォルトの名無しさん
07/11/10 03:20:49
>>326
あ、今試したらだめだった
なんでダメなんだっけ?
332:デフォルトの名無しさん
07/11/10 03:24:53
structの部分も含めて「型」なんだって事じゃないの?
333:デフォルトの名無しさん
07/11/10 03:26:19
つまり、main() {
struct _person *p;
}
にしたらOKってことか
334:デフォルトの名無しさん
07/11/10 03:59:01
ヌルポインター
335:デフォルトの名無しさん
07/11/10 04:10:51
以下のコードでコメントアウトをはずすとエラーが起こるのは何故ですか??
#include <stdio.h>
int main(void)
{
char *p = "ABCD";
char *q;
q = p;
// q[1] = 'D';
printf("p = %s\nq = %s\n", p, q);
return 0;
}
336:デフォルトの名無しさん
07/11/10 04:12:55
char p[] = "ABCD"; と宣言したら正常に動作した(ADCD)のですが、
なんでですか?
337:デフォルトの名無しさん
07/11/10 04:13:26
ポインタは配列で操作出来るのでは
338:デフォルトの名無しさん
07/11/10 04:17:07
ファミコンってC言語でプログラムされてるの?
スレリンク(tech板)
339:デフォルトの名無しさん
07/11/10 04:19:02
PS2の開発環境URLリンク(www.freescale.co.jp)
340:デフォルトの名無しさん
07/11/10 04:55:07
あげ
341:デフォルトの名無しさん
07/11/10 05:34:26
int readfile(LINE *hook, char *fname)
{
FILE *fin = fopen(fname, "r");
char stemp[256];
hook->next = hook->prev = hook;
if(!fin) return 0;
while(fgets(stemp, 256, fin)){
if(!(hook->prev->next = malloc(sizeof(LINE)))) return 0;
if(!(hook->prev->next->str = malloc(strlen(stemp) + 1))) return 0;
strcpy(hook->prev->next->str, stemp);
hook->prev->next->prev = hook->prev;
hook->prev->next->next = hook;
hook->prev = hook->prev->next;
}
このコードを書いたのは誰だあッ!
hook->prev->next->next とか hook->prev->next->prev とか(平気で書ける神経が)理解できねえ(笑)
URLリンク(www.kt.rim.or.jp)
■ げねれーた
342:デフォルトの名無しさん
07/11/10 06:49:28
>>335
"ABCD" は 暗黙の const char * だから。
343:デフォルトの名無しさん
07/11/10 07:33:21
>>342
char p[] = "ABCD";とした時も暗黙のconst char * なのですか?
344:デフォルトの名無しさん
07/11/10 09:11:30
ぬるぽ
345:デフォルトの名無しさん
07/11/10 10:14:42
>>343
それは本当の char p[] だわさ。
だから書き換えても大丈夫。
#include <stdio.h>
int main(void)
{
const char p[] = "ABCD";
const char *q;
q = p;
q[1] = 'D';
printf("p = %s\nq = %s\n", p, q);
return 0;
}
をやってみたら?
346:デフォルトの名無しさん
07/11/10 10:29:36
>>336
char配列の初期化には、例外的に文字列リテラルが使えるという決まりがあるから。
347:デフォルトの名無しさん
07/11/10 10:36:20
>>345
普通に実行できた
$ ./a
p = ADCD
q = ADCD
348:デフォルトの名無しさん
07/11/10 10:57:43
char *p = "ABCD";
は静的なところにある"ABCD"のアドレスをpに入れてるだけ
って認識であってるよね?
349:デフォルトの名無しさん
07/11/10 11:17:54
cc -S a.c して a.s 読めば一目瞭然。
350:デフォルトの名無しさん
07/11/10 11:28:17
>>349
流石に20代だから
流石にアセンブラなんて知りませんよ。流石に
351:デフォルトの名無しさん
07/11/10 12:50:43
>>350
いや。読むだけならアセンブラは簡単。
ポインタの理解にはアセンブラが、
オイラの持論だ。
352:デフォルトの名無しさん
07/11/10 17:36:57
アセンブラを理解するのには、ものすごく基本的な
メモリとアドレスの事知る必要がある。
それがポインタを理解する上でも必要ってだけのことだ。
運転覚えるのにエンジン分解したいひとは、アセンブラからどうぞ。
353:デフォルトの名無しさん
07/11/10 17:44:32
分解したくはないけれど、どんな気筒が幾つ、どんな風に配列されているかは知りたいぞ。
354:デフォルトの名無しさん
07/11/10 20:26:59
float f = 10.0f;
int i = *(int*)&f;
printf("%f %f",i,f);
結果:
10.000 10.000
ちょっと遊んでみるw
355:デフォルトの名無しさん
07/11/10 20:30:30
そのとおりだな。
アセンブラを知らないプログラマーは
自動車運転できるのにボンネットを一度も
開けたことの無い人に相当する。
356:デフォルトの名無しさん
07/11/10 20:38:34
俺アセンブラ知らないけどあんまりポインタで困った覚えがない
ボンネットはウォッシャー液が切れたら空ける
357:デフォルトの名無しさん
07/11/10 20:45:42
学習のとっかかりとしてはいいけど、基本的に
アドレスとポインタとは切り分けて考えた方がいいよ
358:デフォルトの名無しさん
07/11/10 20:47:07
ΩΩ Ω<ナ、ナンダッテー
アドレスとポインタって違いを3行で
359:デフォルトの名無しさん
07/11/10 20:52:18
ポインタには(対象の型)という情報が含まれている。
アドレスと言う概念にはそんなものは全くない。
強いて言うなら、void * のようなもの。
360:デフォルトの名無しさん
07/11/10 20:54:12
ほんとに3行だw
ありがとう
361:デフォルトの名無しさん
07/11/10 21:00:13
そもそも規格には、ポインタの値はアドレスであるなんて一言も書いてない。
ってほんと?
362:デフォルトの名無しさん
07/11/10 21:01:59
普通に考えればそうだろ
変数を間接的に指し示してくれさえすれば用は足りるわけだし
363:デフォルトの名無しさん
07/11/10 21:13:08
>>354
うそだろ?
364:デフォルトの名無しさん
07/11/10 21:19:22
ポインタはアドレスを入れるための変数。
お茶碗とごはんの関係。
365:デフォルトの名無しさん
07/11/10 22:14:51
ポインタはただの変数だ〜
366:デフォルトの名無しさん
07/11/10 22:21:37
>>355
そのたとえで行くならば、IC やトランジスタ弄ったこと
ない人も同じだな。
367:デフォルトの名無しさん
07/11/10 23:35:12
物理化学やら量子力学を勉強してない人も(ry
368:デフォルトの名無しさん
07/11/10 23:39:11
一人の人間の一生程度じゃどうしようもない範囲ですな
369:デフォルトの名無しさん
07/11/11 01:31:28
俺は頭がいいからなんとかなるけど
低収入のオマエラじゃ無理だな
370:デフォルトの名無しさん
07/11/11 01:40:23
>>369
はいはい、掲示板では何とでもいえるさw
371:デフォルトの名無しさん
07/11/11 03:08:02
>>341
実際こう書くこと多いけど何か問題でもあんの?
372:デフォルトの名無しさん
07/11/11 03:10:51
読みにくいってだけじゃないの?
373:デフォルトの名無しさん
07/11/11 03:15:32
>>371,372
まぁ論外だ。論外だということを理解できない君が、プログラマでない
ことを願う。
374:デフォルトの名無しさん
07/11/11 03:31:38
残念
375:デフォルトの名無しさん
07/11/11 05:10:31
>>371-372
おいおい・・・
376:デフォルトの名無しさん
07/11/11 08:08:22
で実際なにがいけないの?
377:デフォルトの名無しさん
07/11/11 09:51:13
何故にポインタが存在するのか。これがわかれば楽勝
378:デフォルトの名無しさん
07/11/11 11:17:01
俺は第一印象で、途中にNULLがあったらどうするんだ?って思ったが。
379:デフォルトの名無しさん
07/11/11 12:34:15
コーディングは暗号解読じゃねえんだ
380:デフォルトの名無しさん
07/11/11 12:51:28
いやぁ、コメントと改行とインデントがちゃんとしてれば
結構普通に読めると思うけど
でもこれはポインタの話とは違くねぇ?
381:デフォルトの名無しさん
07/11/11 12:54:51
>>380
ポインタは普通の構造体に比べてコピーのコストかからないんだから
逐一名前を付け替えたほうが可読性あがるしそっちのほうが良かろう
382:デフォルトの名無しさん
07/11/11 13:10:43
可読性はポインタには限らないじゃないってことを言いたかった
383:デフォルトの名無しさん
07/11/11 13:57:36
英検準2級に落ちたああア
384:デフォルトの名無しさん
07/11/11 14:46:49
>>383
ポインタの問題でつまづいたか?
385:デフォルトの名無しさん
07/11/11 15:48:43
中間ポインタを置いたほうが
読みやすいってことなの?
386:デフォルトの名無しさん
07/11/11 17:00:16
まず中間ポインタって何よ
387:デフォルトの名無しさん
07/11/11 17:59:52
まぁ、C言語だと、短縮した記述とか、複雑なポインタの連鎖をつかって、
「俺、おまえらと違って頭いいんだよ」
と分り難いコードを得意げに自慢げに晒すヤツが
けっこう居る
388:デフォルトの名無しさん
07/11/11 18:00:33
うん
389:デフォルトの名無しさん
07/11/11 18:07:30
頭が良いことは良いことだ
390:デフォルトの名無しさん
07/11/11 19:10:38
>>388,389
ソースコードの読み手が、「このコード大丈夫か?」とか
心配させるようなコード書くようなヤツは頭がいいとは言わない。
ソースコードの読み手が、立ち止まることなく「このコードは
大丈夫」だと確信しながら、スラスラ読めるコードを書くヤツは
頭がいい。
結論としては>>341のようなコードを書くヤツは頭が悪い。
391:デフォルトの名無しさん
07/11/11 19:12:10
たいていの商品は分かりやすさこそ売り物の価値なんだよ。
高齢化社会を迎える日本だと特にそうだ。
戦後の日本文学が、難解であれば崇高だと勘違いして衰退してしまった反省を
ソースコードにおいても生かしてほしいもんだ。
392:デフォルトの名無しさん
07/11/11 19:33:55
同意ではあるんですが
読む人のレベルにもよりませんか?
393:デフォルトの名無しさん
07/11/11 19:37:09
>>390
うん
394:デフォルトの名無しさん
07/11/11 19:52:45
>>392
もちろんプログラマとしての常識は、身につけている
という前提は必要。
常識というのは、言語に関する知識、アルゴリズムに
関する知識、慣用句に関する知識くらいかな。パッと
思いつく限り。
あとは、プログラムが対象としている分野ごとの
知識は前提とするけど。例えば、デコーダのプログラム
のソースコードならば、読み手がそのデコードの
アルゴリズムを知っているという前提をした上で、
プログラムを書くことになる。
395:デフォルトの名無しさん
07/11/11 20:01:26
でも.Net Framework、SQL、XML、WebServices、などなど…。
色々ありすぎて、「言語に関する知識」「アルゴリズムに関する知識」という定義が
やっぱり人それぞれになってしまうと思う。
396:デフォルトの名無しさん
07/11/11 21:04:45
>>395
それはどれも応用プログラミングの専門知識であって常識ではないんじゃないか。
現場の常識という事はあるかもしれないが、それでは一般論とはいえない。
ある範囲で分野を定義した時にその中の最低限の知識というのがあるわけで、
それ以上のテクニックだかノウハウだかを理由も無く濫用するのが良い習慣でないのは
間違いないだろう。
397:デフォルトの名無しさん
07/11/11 21:07:57
つうかそんな基本的なところで俺SUGEEやってないで仕事に集中しろよと
398:デフォルトの名無しさん
07/11/11 23:01:25
べた集中するための遊びだろ。
だいたい1:9ぐらいかな。
399:デフォルトの名無しさん
07/11/12 16:34:54
オ…オ…オレSugeeeee!
…って思うもんさ、プログラマなら…
400:デフォルトの名無しさん
07/11/12 18:32:40
>>341はただのポインタ連結だからいいけどさ、
これがC#のプロパティで同じことやられたりしたら、
もう理解不能だな。
401:デフォルトの名無しさん
07/11/13 17:11:27
char dmoji[36][7][7] = {
{ " ##",
" # #",
" # #",
" #####",
" # #",
"# #"},
{ "##### ",
" # #",
"##### ",
" # #",
" # #",
"######"},
{ " ####",
" ## #",
" # ",
"## ",
" ## #",
" ####"},
。。。略・・・
402:デフォルトの名無しさん
07/11/13 17:13:41
464 名前:仕様書無しさん 投稿日:2007/11/13(火) 16:33:04
SEの兄がいつも独り言で死にたいあー死にたいってよく独り言を言ってます
そんなに仕事は厳しいんですか?
465 名前:仕様書無しさん 投稿日:2007/11/13(火) 16:35:49
動かないものを動きますと言わないといけないからとか?
403:デフォルトの名無しさん
07/11/13 18:16:53
宣言に問題あるよな、
最初からそういうもんだと思ってたからあまり考えなかったけど。
int *p, *q;
じゃなくて
*int p, q;
にすりゃいいんだ。
404:デフォルトの名無しさん
07/11/13 18:18:20
pointer<int> p;
こうだろ
405:デフォルトの名無しさん
07/11/13 18:48:11
>>403
その記法で関数ポインタとポインタを返す関数をどうやって区別する?
406:デフォルトの名無しさん
07/11/13 19:31:17
>>404
実際、C++だとstd::tr1::add_pointer<int>::typeとか
boost::mpl::identity<int*>::typeとか書ける。
::typeとか冗長だけどうまく使えば便利に思うこともある。
407:デフォルトの名無しさん
07/11/13 21:39:21
const int a = 1;
int* p = &a;
ってしたら、*pでaの値を変更できる?
*&a ってした場合は、どう?
408:デフォルトの名無しさん
07/11/13 21:49:06
すいません、上を少し訂正します
const int a = 1;
const int* p = &a;
ってしたら、*pでaの値を変更できる?
*&a ってした場合は、どう?
409:デフォルトの名無しさん
07/11/13 22:10:44
つ const_cast
410:デフォルトの名無しさん
07/11/14 05:54:34
>>408
#include <stdio.h>
int main(int argc, char** argv) //char *argv[]
{
const int a = 1;
const int* p = &a;
printf("a=%d *p=%d\n&a=%p p=%d\n", a, *p, &a, p);
return 0;
}
FreeBSDでの結果
a=1 *p=1
&a=0xbfbff8fc p=-1077937924
411:デフォルトの名無しさん
07/11/14 05:56:03
さらに
#include <stdio.h>
int main(int argc, char** argv) //char *argv[]
{
const int a = 1;
const int* p = &a;
printf("a=%d *p=%d\n&a=%p p=%d\n", a, *p, &a, p);
*p = 5;
a = 9;
printf("a=%d *p=%d\n&a=%p p=%d\n", a, *p, &a, p);
return 0;
}
コンパイルエラー ×2ケ所
412:デフォルトの名無しさん
07/11/14 05:57:54
あ、>>410は間違った
最後は%dじゃなくて%p
printf("a=%d *p=%d\n&a=%p p=%p\n", a, *p, &a, p);
FreeBSDでの結果
a=1 *p=1
&a=0xbfbff8fc p=0xbfbff8fc
413:デフォルトの名無しさん
07/11/14 09:13:50
>>410
あ、何となくわかってきた。
タイプ
ア
ド データ
レ
ス
アドレス*タイプでデータを指し示すから、*pで、データをアドレス&タイプに変換するから、
&aなんだな。
414:デフォルトの名無しさん
07/11/14 09:17:24
413が何を言ってるのかわからんのだが
415:デフォルトの名無しさん
07/11/14 09:21:59
>>414
「*」や「&」という変な文字を使う理由について推測しただけ。
416:デフォルトの名無しさん
07/11/14 09:45:47
&は変数のアドレスを得る演算子
*はポインタの先にある実体を得る演算子
p = &a;
は変数aのアドレスをポインタpに代入。
*p = 5;
はpに入っているアドレスの先を書き換える処理
というのは理解してるのかな?
417:デフォルトの名無しさん
07/11/14 13:08:50
ポインタ変数を使うからよく分からなくなるのではないか?
longかなんかの変数にポインタを代入して、いろいろやってたら何となく分かって来るよ。きっと。
環境依存だけど。
418:デフォルトの名無しさん
07/11/14 13:47:37
なぜわざわざ・・・
419:デフォルトの名無しさん
07/11/14 17:34:00
それやるくらいだったら、
アセンブリ言語使ってみろというほうがずっと有意義。
420:デフォルトの名無しさん
07/11/14 17:39:28
よくアセンブリ言語薦めるやついるけど、
JavaとかC#とかの高級言語触らせたほうが、どうしてポインタが欲しくなるのかを理解するのにはいいんじゃないか?
421:デフォルトの名無しさん
07/11/14 18:00:35
>>420
JavaとかC#だって、ポインタはあるのだから、欲しくなんてならない。
422:デフォルトの名無しさん
07/11/14 18:01:06
アセンブラなんてしなくてもC++とXbyakで遊べばいいんだよ
423:デフォルトの名無しさん
07/11/14 18:02:49
ポインタや再帰を駆使したアルゴリズムの本ない?
424:デフォルトの名無しさん
07/11/14 18:03:53
Javaにもポインタってあるんですか?
425:デフォルトの名無しさん
07/11/14 18:06:45
>>421
ちげーよ、安全に使えるようになってるから理解しやすいかと思ったんだよ。
426:デフォルトの名無しさん
07/11/14 18:06:59
ポインタと再帰はあんまり関係なくね?
427:デフォルトの名無しさん
07/11/14 18:07:34
>>424
ヒント:ぬるぽ
428:デフォルトの名無しさん
07/11/14 18:08:29
>>424
ポインタは無いよ
429:デフォルトの名無しさん
07/11/14 18:11:19
>>420
アセンブラは良く知らんが同意
>>421
趣味でちょっとしたTCP/IPプロトコルを実装しているんだが
ポインタがないと俺には無理ってぐらいだ
こんなものをC#とかJavaとか他の言語でどうやって書けと(ry
ポインタとmemcpyを使ってソース書くときれいになって読みやすくなってるぞ
430:デフォルトの名無しさん
07/11/14 18:13:31
C#にポインタはあるよ
431:デフォルトの名無しさん
07/11/14 18:15:32
C脳から抜け出せてないのやら他言語に疎いのやら
432:429
07/11/14 18:15:35
>>430
あれは紛い物
433:デフォルトの名無しさん
07/11/14 18:22:26
どういう点が?
434:デフォルトの名無しさん
07/11/14 18:23:12
ポインタだけに点
435:デフォルトの名無しさん
07/11/14 18:29:18
これはいい脱力感
436:デフォルトの名無しさん
07/11/14 18:37:23
わふ?
437:デフォルトの名無しさん
07/11/14 23:10:45
>>432
結局根拠無し?
438:
07/11/16 00:10:00
アセンブラ役にたたんかもしれんが
理解を深めるには結局は近道だと思われ
439:デフォルトの名無しさん
07/11/16 07:30:47
ポインタの理解には、メモリとアドレスについて知れば十分。
インストラクションコードの知識が必要になるのは、もっとずっと後。
440:デフォルトの名無しさん
07/11/16 08:37:13
絶対アドレッシングと相対アドレッシングまで押さえれば完璧
441:デフォルトの名無しさん
07/11/16 09:11:57
//
442:デフォルトの名無しさん
07/11/16 21:44:40
い・・・いんす・・・とらく・・・?
443:デフォルトの名無しさん
07/11/17 02:40:14
たー・・・のお・・・ね・・・えちゃん・・・?
444:デフォルトの名無しさん
07/11/17 06:48:29
ハンドアセンブルで COM ファイルを書いてみる。
445:デフォルトの名無しさん
07/11/17 07:24:47
ORG 100
446:デフォルトの名無しさん
07/11/17 07:32:12
ハンドアセンブルが許されるのはZ80までだよねー(AA略
447:デフォルトの名無しさん
07/11/18 10:52:54
全てのものはメモリ上においてあって、位置はアドレスで示せて、ポインタはアドレスを入れる変数、
でいいんじゃね?
448:デフォルトの名無しさん
07/11/18 12:01:50
ポインタの「型」を忘れるなと何度言ったr
449:デフォルトの名無しさん
07/11/18 12:56:38
?
450:デフォルトの名無しさん
07/11/18 14:15:25
エスパーのおれが解説を試みてみる
char *cp;
int *ip;
/* いろいろやる */
cp++;
ip++;
の最後の2行の挙動が>>447には含まれてないってことじゃね?
451:デフォルトの名無しさん
07/11/18 14:37:46
なるほど。ご指摘&解析ありがとう。
では447の補足。
ポインタには加算減算が定義されている。加算結果のアドレスがいくつ増えるかはポインタの型に依存する。
intが4バイトの処理系でintのポインタに+1するとアドレスは4バイト移動する。
これはメモリ上の連続領域にかかれたintデータにアクセスする際に便利。
ぜんぜんわかりやすくないな。サーセン。
452:デフォルトの名無しさん
07/11/18 14:39:50
なるほど。ご指摘&解析ありがとう。
では447の補足。
ポインタには加算減算が定義されている。加算結果のアドレスがいくつ増えるかはポインタの型に依存する。
intが4バイトの処理系でintのポインタに+1するとアドレスは4バイト移動する。
これはメモリ上の連続領域にかかれたintデータにアクセスする際に便利。
ぜんぜんわかりやすくないな。サーセン。
453:デフォルトの名無しさん
07/11/18 14:40:05
加算減算に触れるのには相対アドレス絶対アドレスみたいなのも理解が必要だと思うけど
こういう仕様が表に出ている事のメリットがいまひとつわからない
454:デフォルトの名無しさん
07/11/18 15:10:32
>>447
厳密に言うとメモリ上にない変数もあるのだ、ふっふっふ。
455:デフォルトの名無しさん
07/11/18 15:25:00
レジスタ上ってこと? 確かに忘れてた。ご指摘感謝。
まぁポインタの話をするときはメモリ上って事でいいのでは?
456:デフォルトの名無しさん
07/11/18 15:26:36
いまレジスタってあるの?
457:デフォルトの名無しさん
07/11/18 16:12:24
あるよ、何言ってるんだ?
458:デフォルトの名無しさん
07/11/18 16:28:51
全然意識したことないや
459:デフォルトの名無しさん
07/11/18 16:34:56
じゃあ
register int i;
&i;
ってやってみるといいよ。コンパイラに怒られるから。
460:デフォルトの名無しさん
07/11/18 16:50:18
C言語に register はあるけど、どう扱うかはコンパイラ任せ
じゃない?実際任せるしか無いと思うけど。多少配慮は
してくれるはずだが、下手するとかえって遅くなる場合もある。
CPU 上の話はまたそれはそれで違うよね。
461:デフォルトの名無しさん
07/11/18 17:48:35
レジスタ増えすぎだし人間が管理するより任せた方がいいわな
高級言語でわざわざ意識する機会なんてまず無いわ
462:デフォルトの名無しさん
07/11/18 17:50:14
registerなんてもう10年位使ってない
463:デフォルトの名無しさん
07/11/18 18:26:58
ま、今時register修飾なんか無視するコンパイラがほとんどだよね。
ただしアドレスだけは取れないようになっている。
464:デフォルトの名無しさん
07/11/18 21:02:19
そういえば俺も 10 年以上前にどの変数を register 宣言すると速くなるか、
とか一所懸命自分のコードで調べてた覚えがあるな。けどもうずっと使って
なくてコンパイラ任せ。
465:デフォルトの名無しさん
07/11/20 16:08:13
registerを使わなきゃならんような場面、今後はもうないだろうね。
少ない資源で必死に高速化してた頃が懐かしす。
466:デフォルトの名無しさん
07/11/20 17:48:31
組み込み系ではまだ、たまに使う場面あるけどね。
467:デフォルトの名無しさん
07/11/21 15:31:11
regster使うくらいだったら、自分がアセンブリ言語で書いたほうがいいと考えてしまう。
468:デフォルトの名無しさん
07/11/21 16:32:17
&使わないループ変数には付けときゃいいんだよ。
レジスタが空いてないなら勝手に使われないだけなんだから。
469:デフォルトの名無しさん
07/11/21 16:41:02
そういうど素人なコードは書きたくないなあ。
組み込み系だったらつけるのはわかるけど、
それ以外だったら間抜け以外の何物でもない。
下手したらオプティマイザーを混乱させてかえって遅くなることもあるし。
つっても今の処理系だったらみんな無視するだろうから大丈夫とは思うけど。
なので場所を弁えずregister修飾入れているやつはど素人。
470:デフォルトの名無しさん
07/11/21 16:44:13
>>468
逆!逆!よっぽどの理由がない限りつけないのが普通だってば
471:デフォルトの名無しさん
07/11/21 18:50:12
アドレスを取られたく無い時ぐらいしか思い付かん
472:デフォルトの名無しさん
07/11/21 19:08:20
アドレスを取られたくない時ってのが思いつかん
473:デフォルトの名無しさん
07/11/21 19:39:28
gnuのソースなんか付けまくりだぜ
474:デフォルトの名無しさん
07/11/21 20:23:13
太古のソースを後生大事に保持してるからねえ
475:デフォルトの名無しさん
07/11/21 22:12:01
今時のコンパイラなら謹んで無視するだろ。
476:デフォルトの名無しさん
07/11/21 22:21:49
C++ならregister変数でもアドレス演算子が使えた気がする。
477:デフォルトの名無しさん
07/11/24 10:45:17
最適化なんてコンパイラにやらせときゃいいのさ。
いろんな環境に移植するソースで、いちいちregister付けたり
外したりなんて馬鹿らしくてできん。
478:デフォルトの名無しさん
07/11/25 13:08:45
Cでヌルポが(void *)0ってマクロ定義される理由が分からん。
C++では、「ヌルポを(void *)0って定義してはダメ」って記述されてる
本があるけど、その理由も分からん。
結局、ヌルポは、どう理解しておいたらいいのだ?
Cでは、ヌルポの型は、(void *)なの?
C++では、ヌルポの型は、なんだ?
479:デフォルトの名無しさん
07/11/25 13:24:31
C++の本の方は(void *)型の話じゃなくて
0がダメって言ってるだけじゃないの?
C自体も0とは定義してないはず
型は・・・どうなんだろう
強いて言えばvoid *型な気がするけど
480:デフォルトの名無しさん
07/11/25 13:50:17
NULLは0じゃない。0がNULLなんだ。
この法則に則って考えれば、NULLはCでもC++でも0と定義されるべきであり、それ自体は8進定数と言うことになる。
481:デフォルトの名無しさん
07/11/25 13:55:36
>>478の論点は「型は、なんだ?」だと思うが・・・
ちなみになんで8進?
482:デフォルトの名無しさん
07/11/25 14:14:33
ポインタくらい簡単なものが一般的に「ポインタが難しい」とされてるおかげで、C始めたばっかの人が「ポインタが理解できません」と言ってくれるので(難しいとされているので躊躇せずに言いやすい?)面接のときのモグリ排除に大いに役に立っている。
483:デフォルトの名無しさん
07/11/25 14:16:21
それを考えて新人に特別な扱いせずに
普通に変わった変数としてポインタ教えてたら
やっぱり2年目になっても分かってなかった
484:デフォルトの名無しさん
07/11/25 14:16:55
0で始まるから8進数。
485:デフォルトの名無しさん
07/11/25 14:17:15
ポインタって精々理系にとっての微分積分程度のレベルでしょ
486:デフォルトの名無しさん
07/11/25 14:21:10
16進は0から始まりませんか?
487:デフォルトの名無しさん
07/11/25 14:22:53
>>485
いや、分数の割り算程度でしょ
488:デフォルトの名無しさん
07/11/25 14:24:09
微積分マスターよりポインタマスターの方が数段楽。覚えなきゃいけない事項の絶対量が少なすぎる。
489:デフォルトの名無しさん
07/11/25 14:27:41
ポインタって何を覚えるんだ・・・
490:デフォルトの名無しさん
07/11/25 14:31:09
ポインタ(の存在意義)がわかりませんって面接で言ったらなにがわからないのか聞いてくるから
とくとくと語ってみたら面接官涙目になってた。
491:デフォルトの名無しさん
07/11/25 14:32:16
面接官って技術者の人やってんのかー
ウチの会社は総務だか人事だかがやってたなぁ・・・
492:デフォルトの名無しさん
07/11/25 14:44:45
ポインタがわからないって、ものごとの裏側(仕組み)が
どうなってるのか少しも考えてこなかった証拠じゃね?
コンピュータの中で関数がどうやって呼び出されてるのとか、
変数はどうやってわたされてるのとか、
時計の針はどうやってまわるのとか、
えんぴつとか棒付きアイスはどうやってつくるのとか
普通は自分なりに考えてみるものじゃん
493:デフォルトの名無しさん
07/11/25 14:46:38
赤ちゃんはどうやっ(ry
494:デフォルトの名無しさん
07/11/25 14:57:32
>>492
そうやって裏側の裏側の裏側の……って調べていくとキリがないので、
あるところで計算を打ち切ってcall-by-needで遅延的な思考をすることだってあろう。
そのためにいろんな学問やら処理系やらは多層構造になってるし、
インターフェースが決まってれば実装が見えなくたってかまわないんでしょうよ。
コンピュータをやるなら最低でもアセンブラとかマシン語が云々、とかいう人はそこが分かってない。
495:デフォルトの名無しさん
07/11/25 15:03:53
このスレポインタスレだからしょうがないかと思っていた
496:デフォルトの名無しさん
07/11/25 15:19:54
アセンブラ出身の俺からみてポインタはなんであんな面倒な仕組みなのか理解できないよ。
497:デフォルトの名無しさん
07/11/25 15:21:36
おっちゃん乙
498:デフォルトの名無しさん
07/11/25 15:26:45
>>494
違うんだ
具体的な仕組みを正確につきとめるというより
少なくとも自分のなかでつじつまが合うように
モノゴトの裏側を想像するってこと
抽象化して考えることが出来る奴は、少なくとも
具体の一例を想像して挙げてみることができると思う
499:デフォルトの名無しさん
07/11/25 15:38:00
合理的に考えられる奴ならポインタのおかしさ、不自然さに気づくだろうよ
500:デフォルトの名無しさん
07/11/25 15:39:28
>>478
ぬるぽは、あらゆるポインタ型について存在する。
int*のぬるぽ、void*のぬるぽ、char*のぬるぽ、void(Foo::*)(void)のぬるぽ・・・
定数「0」は任意の型のぬるぽに暗黙に変換できるので、NULLマクロを0と定義しているのは妥当。
単なる0でなく(void*)0と定義してる場合もあるが、その理由は、単なる0は整数型にもなるので、
char c = NULL;
と書くバカがしばしば現れるため。
(void*)0は整数型としては通らないので、これで一応そういうバカを少しは防げる。
Cではvoid*はあらゆるポインタ型に暗黙に変換できるので、これでも特に問題はない。
C++ではvoid*の暗黙の変換が無くなったので、(void*)0をNULLの定義には使えなくなった。
つまり例えば
int *p = (void*)0;
というのはCでは通るがC++では通らない。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5373日前に更新/171 KB
担当:undef