C/C++の一次元配列、二次元配列、ポインタ、配列ポインタ、ポインタの配列、行アドレスと列アドレスの関係を徹底的に把握する.
http://wenku.baidu.com/view/acf838ef856a561252d36fe3.html
。
#include <iostream>
using namespace std;
int main()
{
int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
typedef int int_array[4];
for (int_array *p =ia;p!= ia+3;++p)
{
for (int *q=*p;q!=*p+4;++q)
{
cout<<*q<<" ";
}
cout<<endl;
}
return 0;
}
、 typedef int int_array[4];
typedef , , , , 。
, :int_array。 [4] , , : 4 int int_array。
? 。
,int a[4]; 。 typedef, typedef int a[4]; a int_array 。 : a , , int_array ( ), 。 。
、 int_array *p =ia;
, , int_array ia。
ia ? 。
a, :&a[0] a, 。
, ? , 。 :
&ia[0] ia。
,int_array *p =ia; int_array *p =&ia[0]; 。
,&a[0] &ia[0] 。 , 。
, cout 。 , , , , 。
, int_array *p =ia; p , p, p ( ), ia[0], ia[0][0] 。 , p , p 4 , ia 4 。
ia[0] 。ia[1]、ia[2] 。
、 ++p
,p ia[0], (p+1) ia[1] ? 。
, ia[3], :p!= ia+3。
、 int *q=*p;
, q, *p。
*p ?
:p ia, &ia[0]。 *p ia[0]。
:p , ,*p , 。
ia[0] , 。 ? ,
q=*p q=ia[0], q=&ia[0][0]。
,q 。 , q 。 ,++q &ia[0][1]。 , ++q, &ia[0][2] 。
*p+4。
*p , ia[0] ia[1] ia[2], ia[0] ia[1] ia[2] 。 , 。
, ? a ,a+4 ? :&a[4], a[4] 。
*p+4 :p , , 。
*q ?
q , *q 。 ,cout 。
, , 。
:{int a[4][5];int (*p)[5]=a;} a , ;p , 5 int , p ;p+i a i ,*(p+2)+3 a 2 3 ( 0 , 0 ),*(*(p+2)+3) a[2][3] 。
, [] *, :
char **p,a[6][8]; p=a ? ?
:
#include<stdio.h>
void main()
{
char **p,a[6][8];
p = a;
printf("
");
}
コンパイルして、それから を しますが、エラー1 error C 2440:“=”:“char[6][8]”から“char**”に できません. 1では、 はvoid fun(int arr[2][3])である.この は2 3 のint のみを うことができます. 2は、 の さを することができる. はvoid fun(int arr[][3]);このような は、 が されていますが、1 につき3つの の さの しか できません.またはこのような でvoid fun(int(*arr)[3])と く.これは ポインタまたは ポインタと ばれるもので、arrと*は に して、3つのintタイプのデータを つ を します. 、 を します. の は のものを すポインタ、すなわち ポインタです. はint funです.この は、 の なる さのデータを に することができる. : をベクトルを すポインタ に するだけで、このようにすることができます. えば、 のプログラムは にabcを することができます. ポインタは を すポインタと ばれ、データタイプ(*ポインタ )[1 ]eg:int(*p)[4]とも ばれます.ポインターの ( の )eg int*pp;ppは の で、*ppは の です.pp+1は アドレス、*pp+1は アドレスです.#include <iostream>
using namespace std;
void test(char **ptr)
{
for(;(strcmp(*ptr,"NULL"))!=0;ptr=ptr+1)
cout << *(ptr) << endl;
}
int main()
{
char *p[] = {"abcsdad", "def", "ghiffaghjjkjkkk","NULL"};
test(p);
return 0;
}
:
///////////////!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!////////////////////////////////////////////////////
(1)
int b[3][3] ={{1,2,3},{4,5,6},{7,8,9}};
int j,k,(*q)[3];
q=b;
for(j=0; j<3; j++)
{
for(k=0; k<3; k++)
{
//cout << *(*(b+j)+k) << " ";
cout << *(*(q+j)+k) << " ";
}
}
cout << endl;
char name[][17]={"Follow me","BASIC","Great Wall","FORTRAN","Computer desighn","ok"};
char (*p)[17];
for(p=name;strcmp(*p,"ok")!=0;p++)
{
cout<<*p<<endl;
}
(2)
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer desighn"};
char **p;
int i;
for(i=0;i<5;i++)
{p=name+i;
printf("%s
",*p);
}
:
char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer desighn"};
char **p;
int i;
for(i=0;i<sizeof(name)/4;i++)
{p=name+i;
//name+i ,name[i] ,&name[i] , p 。
// p=&name[i];
//cout<<sizeof(name)<<endl;
//cout<<(name[i])<<endl;// *p , ,name[i] ,p ,*p
printf("%s
",*p);
}
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define dim(x) sizeof(x) / sizeof(x[0])
void main()
{
char name[][17] = {
"Follow me",
"BASIC",
"Great Wall",
"FORTRAN",
"Computer desighn",
};
char (*p)[17] = name;
int nCount = dim(name);
while (nCount-- > 0)
{
cout << *p++ << endl;
}
}
, char*name[] , char name[][17] , 。 。
int :
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define dim(x) sizeof(x) / sizeof(x[0])
#define dam(x) sizeof(x) / sizeof(int)
void main()
{
int aArray[]={1,2,3,4};
int bArray[]={5,6,7,8,9,10};
int cArray[]={11,12,14,15,16,17,18,19,20,21,22};
int *name[] = {
aArray,
bArray,
cArray,
};
int **p = name;
int aColum=dam(aArray);
int bColum=dam(bArray);
int cColum=dam(cArray);
int nCount=sizeof(name)/4;
int i ,flag;
for(i=0;i<nCount;i++)
{ int *j=name[i];
flag=i;
switch(flag)
{
case 0:
for(;j<name[i]+aColum;j++)//name[i] , name+i , int * , name[i]+j
cout<<*j<<" ";
cout<<endl;
break;
case 1:
for(;j<name[i]+bColum;j++)
cout<<*j<<" ";
cout<<endl;
break;
case 2:
for(;j<name[i]+cColum;j++)
cout<<*j<<" ";
cout<<endl;
break;
}
}
}
(3)
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int *p;
for(p=a[0];p<a[0]+12;p++)
cout<<*p<<endl;
へのアクセスを てください.
int aq[12]={1,2,3,4,5}
int(**p)[12]///// ポインタも アドレスです.
p=&aq;// の
cout<cout<<for(int i=0;i<5;i+)
cout<*(p[0]+i)<
との
int aq[12]={1,2,3,4,5}
int*p;// のアドレス
p=aq;
for(int i=0;i<5;i+)
cout<*(p+i)<
このような もできます.ポインタ の がポインタであることを えておけばいいです.
int a[]={12,12,34,5}; int b[]={13,17} int c[]={123,56,4} int*ia[3]={a,b,c}
「C プログラミング」10.3 の で しています. とても に つ の 、 を てください!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!int a[3][4]={0,1,2,3,4,5,6,7,8,9,11}cout< アドレスのように、 をつけると、 アドレスになります.つまり、 アドレスになってから、 に*を えてこそ、 の が れます. を してください. のような を してください. include includeusing namespace std;void main(){char name[]={17]={Followe me]、“BASIC”、“Great Wall”、“FOTRAN”、“Computer desighn”、“ok”、char(*p)[17]=name;for(***"=='''+p+)の を しないでください. #include include includeusing namespace std;define dim(x)sizeof(x)/sizeof(x[0])void main(){char name[]=={Follow me],[BASIC],[Great Wall],[FOTRAN"、"Coputterdesighn"""""""""""""""""""""";char(*p"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""はい、はははは!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! intの を てください.define dim(x)sizeof(x)/sizeof(x[0])void main() int name[][4]={ {1,2,3,4} {5,6,7,8} {9,10,11,12} }; int(*p)[4]=name; int nRow=dim(name)//3 int nColum=(sizeof(name[0]/sizeof(int)//4 for(int j=0;j<nRow;j+) {for(int i=0;i<nColum;i+) cout<*((*(p+j)+i)///pは ポインタであり、 ポインタであるのに し、p+jは ポインタであり、*pは ポインタであり、*p+iは ポインタである. cout<#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int arr1[3];
int arr2[3];
int arr3[3];
int * ptr;
// ptr1 int [3] , ptr &arr1 , :arr1
int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};
// ptr2 int * , ptr2 &ptr , :ptr
int * ptr2[3]={arr1,arr2,arr3};
// ptr3 int [3] , ptr3 &arr1 , :arr1
int(* ptr3)[3]=&arr1;
ptr3=ptr1; // ,
// ptr3=ptr2;//error “int *[3]” “int (*)[3]
// ptr4 int * , ptr4 &ptr , :ptr
int ** ptr4;
//ptr4=&arr1; //error “int (*)[3]” “int **
ptr4=ptr2; // ,
//ptr4=ptr3; // error “int (*)[3]” “int **
return 0;
}
, ,“ ” “ ”
, , , , ,
: -> : * , -> -> , &。
int a[]={12,34,54};
int aa[][3]={{13,4,5},{5,6,3}};
int (*pp)[3];//pp , int **rr; rr
int **rr;
pp=a;// , , pp , , , &
pp=&a;//
pp=aa;//
pp=&aa;// , , int(*)[2][3] int(*)[3]
pp=&aa[0];// ,aa[0] &
int a[]={12,34,54};
int *r=a;//int * ,
int **rr;//int ** , rr=&a , rr
rr=&r;
for(int i=0;i<sizeof(a)/4;i++)
cout<<*(*rr+i)<<endl;//*rr r
、
, ; , 。