现在的位置: 首页 > 综合 > 正文

指针数组和数组指针

2019年04月26日 ⁄ 综合 ⁄ 共 2320字 ⁄ 字号 评论关闭

int*p[2]与int(*p)[2]

(1)int*p[2]是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型。 

可以这样来用: 

   #include <iostream.h> 
   void main(){ 
    int*p[2]; 
    int a[3]={1,2,3}; 
    int b[4]={4,5,6,7}; 
    p[0]=a; 
    p[1]=b; 
    for(inti=0;i <3;i++)cout < <*p[0]+i;//cout < <**p+i; 
    cout < <endl; 
    for(i=0;i <4;i++)cout < <*p[1]+i;//cout < <**p+i; 
  } 

(2)对于 int(*p)[2],它相当于一个二维数组的用法,只是它是一个n行2列的数组,可以这样来用: 

#include <iostream.h> 
void main(){ 
  int (*p)[2]; 
  int b[3][2]={{1,2},{3,4},{5,6}}; 
  p=b; 
  for(inti=0;i <3;i++){ 
  for(intj=0;j <2;j++)//cout < <p[i][j];//cout < <*(*(p+i)+j); 
  cout < <endl; 
   } 

 

 

注意:对于(1)为行数确定、列数不确定,即为2*n型的。(2)为n*2型的数组的指针用法,即行数不确定、列数确定。对于(1)其等价形式如下: 

#include <iostream.h> 

voidmain(){ 

int**array; 
array=newint*[2]; 
inta[3]={1,2,3}; 
intb[4]={4,5,6,7}; 
array[0]=a;//*array=a; 
array[1]=b;//*(array+1)=b; 
for(inti=0;i <3;i++)cout < <array[0][i];//cout < <*array[0]+i; 
cout < <endl; 
for(intj=0;j <4;j++)cout < <array[1][j];//cout < <*array[1]+j; 

其实以上用法即这我们常用的动态二维数组的用法。
a) 一个整型数(An integer) 
b)一个指向整型数的指针( A pointer to an integer) 
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r 
d)一个有10个整型数的数组( An array of 10 integers) 
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to 
integers) 
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers) 
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function 
that takes an integer as an argument and returns an integer) 
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer ) 
答案是: 
a) int a; // An integer 
b) int *a; // A pointer to an integer 
c) int **a; // A pointer to a pointer to an integer 
d) int a[10]; // An array of 10 integers 
e) int *a[10]; // An array of 10 pointers to integers 
f) int (*a)[10]; // A pointer to an array of 10 integers 
g) int (*a)(int); // A pointer to a function a that 
takes an integer argument and returns an integer 
h) int (*a[10])(int); // An array of 10 pointers to
int (*p)[4];//是指向一个2维数组的指针int **P;//是一个指针的指针两个都是指向地址的int (*p)[4] 是接收二维数组的地址(常量)int **p 是接收指针变量的地址(变量)
int *p;是一个指针变量,与之相对应的是int p[n];int (*p)[4];//是指向一个2维数组的指针,与之相对应的是int p[][4]; int **p;//是指向一个指针的指针 ,与之相对应的是int *p[n],它们都是指向字符串的指针数组,而且二位动态数组开辟后只能将值赋予它(**p),因为只有它的数据结构才能满足;两个都是指向地址的 。很多朋友为二维动态数组的数据结构感到困惑,现在我将我对它的分析先给大家,希望对大家能有一些帮组:先通过p=(int **)malloc(n*sizeof(int
*));相当分配了n个连续的int *类型的内存空间,它们的地址是相连的,即p[n]数组,其类型是int *类型,现在为数组中的每个变量(p[0]、p[1]、p[2]…p[n-1])赋值,赋的值都是地址值,也就是for(i=0;i<n;i++)p[i]=(int *)malloc(m*sizeof(int));其中,每个p[n]相当于一维数组的数组名,由于内存分配函数分配内存是随机的,所以这n个一维数组并不是相连的,这与二维静态数组中的每个一维数组的地址是相连接的不同。

抱歉!评论已关闭.