質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4536閲覧

C++ 配列ポインタに代入したいですか、文字列のようにできませんでした。

Kuroiwa_haruka

総合スコア13

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/01/19 09:31

初心者です。C++で

char a[]="asd";

のように代入できるが、

int a[]=123;

のように代入できないですか?

ちなみに、

int a1[3],a2[3];
int *p[2];

p[0]=a1,p[1]=a2;
//その後for文で
p[0][0]~p[2][3]に数を代入

のように作った二次元配列を関数に代入したいですが、どうすればいいですか?

void function(int *p){}

int main{

...

function(p);

このように書いたら、エラーが出ました。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2018/01/19 09:53

数値の123を桁ごとに配列に分けて格納したいということでしょうか?
Kuroiwa_haruka

2018/01/20 13:05

いいえ、どうやって配列ポインタを定義するのを知りたいだけです。  int a[]=123; でも  int a[]={123}; でも int a[]={1,2,3}; でも構いません。
guest

回答3

0

ベストアンサー

こんにちは。

"abc"は、char型の値が合計4つ並んだものです。'a', 'b', 'c', '\0'ですね。
これらをchar型の配列へ代入できます。

'123'は、int型の値が1つだけです。なので、配列へ代入できません。
もし、1, 2, 3を代入したいのであれば、下記にていけます。

int a[]={1, 2, 3};

2次元配列を関数に渡すのは色々面倒です。
生の配列の場合、C++が要素数をほとんど管理してくれないからです。

C++には便利な動的配列としてstd::vectorがあるので、これを使って2次元配列を作れば簡単です。

C++

1#include <iostream> 2#include <vector> 3 4typedef std::vector<std::vector<int> > Vector2D; 5 6void function(Vector2D& iVector2D) 7{ 8 for (size_t i=0; i < iVector2D.size(); ++i) 9 { 10 for (size_t j=0; j < iVector2D[i].size(); ++j) 11 { 12 std::cout << iVector2D[i][j] << " "; 13 } 14 std::cout << "\n"; 15 } 16} 17 18int main() 19{ 20 Vector2D aVector2D = { {1, 2, 3}, {4, 5, 6, 7} }; 21 function(aVector2D); 22}

wandbox

なお、aVector2D の初期化処理のため、C++11でないとコンパイルできません。
C++11なら範囲ベースforを使うともう少しスマートにかけますが、あまり色々書くと混乱すると思いますので割愛します。

投稿2018/01/19 09:53

編集2018/01/19 09:56
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/01/20 07:49

>生の配列の場合、C++が要素数をほとんど管理してくれないからです。 は真だけど、その代替はstd::arrayをあげるべきではありませんか?std::vectorだと意味合いが違うような(C++11以前を考慮しての回答だとは思うのですが
Kuroiwa_haruka

2018/01/20 13:11

すみません、int a ではなく、int *a の代入について知りたかったです。打ち間違いすみません。。。 そして、二次配列では、このような二次配列を使ってくださいという問題なので、ほかの方法教えていただきありがとうございます。しかし、使ってはいけません。 本文に書いていたような二次配列のポインタを関数に代入する方法を教えてください。 よろしくお願いします。
Chironian

2018/01/20 13:25

yumetodoさん。 おっしゃる通りarrayの方が近いのですけど、vectorの方がメジャーなので初心者向きかなと思って。 Kuroiwa_harukaさん。 int *a = 123;もできないですよ? > 本文に書いていたような二次配列のポインタを関数に代入する方法を教えてください。 要素数を渡せないのでC++で使うのはレアですが、下記のように宣言すればfunction(p);で呼べますよ。 void function(int *p[]){}
Kuroiwa_haruka

2018/01/20 13:42

int *a= ??? の???をどうすればできるのですか? void function(int *p[]){}を定義した後に、どうやってmainで定義した int *p;を代入するのですか?例えば function(p); ???
Chironian

2018/01/20 13:54

> int *a= ??? の???をどうすればできるのですか? 記述されることが多いコードは、int *a=nullptr; や int *a=NULL;ですね。 nullptrやNULLでない場合、int *a;に設定したいものは何でしょうか? もし、123が設定されている領域のアドレスを設定するのであれば下記です。 int val=123; int* a=&val; 残念ながら、int* a=&123;はできません。 > どうやってmainで定義した int *p;を代入するのですか? int *p;はどこからでてきたのでしょうか? int *p[2];の間違いであれば、下記の通りです。 void function(int *p[]){} int main() {   int a[3] = {1, 2, 3};   int b[3] = {4, 5, 6};   int* p[2] = {a, b};   function(p); }
guest

0

こういうことですか?

C

1#include <stdio.h> 2 3void func(int *p[]) 4{ 5 *(p[0])= 1; 6 *(p[0]+1)= 2; 7 *(p[0]+2)= 3; 8 9 *(p[1])= 4; 10 *(p[1]+1)= 5; 11} 12 13int main() 14{ 15 int a1[3], a2[2]; 16 int *p[2]= { a1,a2 }; 17 18 func(p); 19 20 return 0; 21} 22

追記

c++

1usr~/test >./a.out 20:1 31:4 40:2 51:5 60:3 71:6 8usr~/test >cat tst1.cpp 9#include <iostream> 10 11using namespace std; 12 13void func(int *p[]) 14{ 15 for( int i= 0; i < 3; i++ ){ 16 cout << "0:" << *(p[0]+i) << endl; 17 cout << "1:" << *(p[1]+i) << endl; 18 } 19} 20 21int main() 22{ 23 int a1[3]= {1,2,3}; 24 int a2[3]= {4,5,6}; 25 int *p[2]= { a1,a2 }; 26 27 func(p); 28 29 return 0; 30} 31

投稿2018/01/20 13:35

編集2018/01/20 14:10
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

「ちなみに、 」以下に関してだけ。C++特有ではなくC言語の範囲内ですが。

int *p[2]; とした場合、
void function(int p){}
ではなく
void function(int **p){}
にすれば
function(p);
で渡せるのでは?
(配列変数や関数定義の
をそれぞれ1個ずつ減らした場合を考えてみるとわかりやすいかもしれません。)

投稿2018/01/20 13:22

okrt

総合スコア366

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuroiwa_haruka

2018/01/20 13:24

確かにこのようなエラーが出てきました。やってみます。ありがとうございます。
Kuroiwa_haruka

2018/01/22 02:35

よく確認したら、課題は必ずvoid function(int *p){}のような形を使わないといけないようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問