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
 
              ,                      ;              ,        。