No.1
- 回答日時:
変数のアドレスというものは、表示するためにあるのではなく、使うためにあるのです。
メモリ上に確保されたint変数のアドレスだけ分かっても、どうやって使えばいいかわからないですよね?
そのために、intのアドレスを入れるための変数を作り、そこにアドレスを格納して使うのです。
int bの中にあるアドレスを見に行って、そこにある値を見たり、書いたりって感じです。
回答ありがとうございます。残念ながらいまいちよくわかりません。
ではdoubleやcharの型の場合だとintと何が異なるのでしょうか?
メモリ上で確保する領域のサイズは同じはずですよね?
No.2
- 回答日時:
>単に変数のアドレスを表示するだけならば型はいらない
C言語では、型はその型分類によって特徴付けるという
前提があるからです。
# JIS X3010 - 6.2.5 あたり
それぞれの型分類は規約で規定されるか処理系に
依存するかのいづれかとなります。
ポインタにも型分類がないと、関数なのか、
整数なのか配列なのかといったような分類ができないからでしょう。
#ポインタ型については規約に規定されていると思います。
>どうして ポインタに型があるのでしょうか?
そういう細かいところが気になるのでしたら、
C言語やC++の規格書などを一読する事をお勧めします。
>またこのとき宣言された変数は *b ではなくて bであってますよね?
あっていると思います。
# int* 型の d という変数になります。
No.3
- 回答日時:
こんばんは.
ポインタに型がある理由の一つは「ポインタ演算」のためです.
int num[2], *pnum;
なる宣言があるとして,
pnum = num;
とすれば *pnum はnumの先頭の値を参照します.
次に
pnum++;
とすると *pnum はnumの2番目の値を参照します.
ごく普通にやっていることですが,上記のことを行うには
pnum = pnum + 1
という演算が「pnumをint型のサイズだけ移動する」ことでなければなりません.
単純に pnum がアドレスの値だけを格納していて,それを1加算する意味しか持たないなら,
pnum++ はint型(大体は32bit)の変数の「途中」を指してしまいます.
要するにポインタに型があることで「加減算のときの飛び幅」を自動的に調整できます.
実際,
double *pdnum;
に関して, pdnum++; としたときと pnum++;としたとき,
それぞれがdouble型要素一つ分,int型要素一つ分ジャンプしてくれることでしょう.
ですが,型がなければ上記の演算は
pdnum += sizeof(double)
pnum += sizeof(int)
と書かねばならないということです.
No.4
- 回答日時:
この疑問は核心をついたというか、考え方は間違ってないと思います。
むしろ私も、文字はchar、整数はint、だったらアドレスはint*とかじゃなくてpoint型だろうと思うんですよね。
ちなみに漠然とアドレスを渡したい場合が実際ありまして、そういう場合は「void*」という宣言を使います。
型が必要な理由は、もう既に十分な回答が出ているようですね。
私流に言うと「int a = 3.14;」これがエラーになるのと同じ理由です。
int a=0;
int* p = &a;
*p = 100; //a=100;
*p = 3.14; //a=3.14;これはエラーにしないとまずいですよね? だから整数を示すためにint*が必要。
No.5
- 回答日時:
> メモリ上で確保する領域のサイズは同じはず
えーと……
sizeof(char)
sizeof(int)
sizeof(double)
さてそれぞれいくつになるでしょうか。
問題なのは「アドレスのサイズ」じゃなくて「アドレスが指す先にあるもののサイズ」なのです。
No.9
- 回答日時:
>No6さん
私のコンパイラではワーニングになりました。
例えが悪かったみたいですね、その点はすみませんでした。
しかし質問への回答として、本質的な部分で間違えているとは思いません。
勿論実行する上で支障はないでしょうが、型について語る時に3.14(float)と3(int型)が同じ扱いで良いわけがありません。
>No.7さん
>どうして、ポインタに型があるのでしょうか?
まず大前提はこの質問です。
>ではdoubleやcharの型の場合だとintと何が異なるのでしょうか?
>メモリ上で確保する領域のサイズは同じはずですよね?
だとすれば、doubleやcharは暗黙的にcouble*やchar*と解釈できると思うのですが。
No.7さんが仰るとおり、double*もchar*もint*も確保するサイズは同じはずです。
回答ありがとうございます。
double*もchar*もint*も確保するサイズは同じはずです
とのことですが、よく考えたらそうですよね。
しかし
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
int main(int argc, char** argv) {
int a;
int *b;
char c;
char *d;
printf("%d",sizeof(a));
printf("%d",sizeof(*b));
printf("%d",sizeof(c));
printf("%d",sizeof(*d));
return (EXIT_SUCCESS);
}
でためしたらそれぞれ4411でintとcharのサイズが同じになりました。どこが間違えでしょうか?
No.10
- 回答日時:
>どうして、ポインタに型があるのでしょうか?
>単に変数のアドレスを表示するだけならば型はいらないと思うのですが。
ポインタが指すアドレスからデータを出したり、データを入れたりする場合や、ポインタを動かす場合に、データサイズが判らないと困ります。
例えば、ポインタが1254番地を指している場合「ポインタが指す1254番地からデータを取り出して」と言われた場合、そこにあるデータが「charのデータ」なのか「intのデータ」なのか判らないと、取り出せません。
また、ポインタが1254番地を指している時「1つ進めて」と、ポインタに1を足した場合、アドレスを幾つ進めれば良いか判りません。
なので「ポインタにも型が必要」なのです。
回答ありがとうございます。
「ポインタが指す1254番地からデータを取り出して」と言われた場合、そこにあるデータが「charのデータ」なのか「intのデータ」なのか判らないと、取り出せません。
(初歩的なことですが)これはデータが複数の番地にまたがって存在しているし、charとintでそれぞれサイズがことなるからですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、写真のプログラムをどう直せ 2 2022/07/09 21:13
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
fopne で失敗する原因
-
C言語のポインタに直接アドレス...
-
Run-Time Check Failure #3とい...
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
C言語の関数と配列に関する質問
-
C言語でのconstを返す関数
-
デバイスハンドルとは?
-
CObArrayとCPtrArrayの違い
-
プーさんのマウスポインタを教...
-
C# 配列とポインタの違い
-
ExcelVBAでのkernel32(64bit)
-
C言語 ポインタ
-
関数ポインタの利点
-
【C言語】戻り値が構造体の関数
-
構造体とfscanf
-
main(int argc,char **argv[])...
-
エラーの意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報