C中二维数组,数组指针,指针数组,指针的指针

1.关于数组和指针的实参和形参类型

实参                               所匹配的形参    编译器类型

数组的数组      char c[8][10];    char (*)[10];   数组指针

指针数组        char *c[10];      char **c;      指针的指针

数组指针(行指针) char (*c)[10];   char (*c)[10];   不改变

指针的指针      char **c;        char **c;        不改变

2.实例理解:

#include  
using namespace std; 
int main() 
{ 
    int arr1[3]; 
    int arr2[3]; 
    int arr3[3]; 
    int * ptr; 
    ptr=arr1;
    // 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=&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; 
}


#include  
using namespace std; 
void test(char **ptr) 
{ 
    cout << *(ptr+1) << endl; 
} 

int main() 
{ 
    char *p[3] = {"abc", "def", "ghi"}; 
    test(p); 
    cout<<*p<return 0; 
}

你可能感兴趣的:(C中二维数组,数组指针,指针数组,指针的指针)