c语言指针*p n个数排序,C语言中指针*p[N], (*P)[N],及**p的区别

在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效。这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方。

这三者的定义分别为:

int  *p[N]表示指针数组,也就是说定义了N个不同指向int型的指针。

int (*p)[N]表示定义一个指针,指向一个int[N]型的指针。

int **p 表示定义一个指向指针的指针。

注意[]的优先级要高于*。

指针即表示一个存放某种数据类型变量的地址,例如:

#include #include

int main()

{int *p, i;int a[3];

p=a;for(i=0; i<3; i++)

a[i]=i;

printf("%d\t%d\n", *(p+1), a[1]);

return 1;

}

这里p存储的是数组a的首地址,且为int类型,那么p+1表示p向后移动一个int型的字节得到的地址,也就是a[1]的地址。

上述结果即为:

1 1

下面通过一些例子来说明这些指针*p[N], *p[N]和**p的区别。

#include

int main(int argc, char*argv[])

{inti, j;int (*p1)[3], *p2[3], **p3;int b[3][3];for(i=0; i<3; i++)for(j=0; j< 3; j++)

b[i][j]= 2*i +j;

p1=b;for(i=0; i< 3; i++)

p2[i]=b[i];

p3= malloc(3 * sizeof(*p3));for(i=0; i< 3; i++)*(p3+i) =b[i];

printf("the matrix is :\n");for(i=0; i< 3; i++)

{for(j=0; j< 3; j++)

printf("%d\t", b[i][j]);

printf("\n");

}

printf("%d\t%d\t%d\n", *(*(p1+1)+1), *(p2[1]+1), *(*(p3+1)+1));

}

解释说明:

*p[3]表示一个指针数组,可以理解为定义了三个指针*p1[0], *p1[1], *p[2],在该例子中分别将b[0]的地址赋值给p[0],b[1]的地址赋值给p[2],...,因此*(p2[1]+1)表示的是*(b[1]+1)的值,也就是b[1][1].

**p表示一个指向指针的指针,也可以理解为p存储的是一个地址的地址。比如在该例子中,{b[0], b[1], b[2]}可以认为是一个数组,里面的元素为一个地址,p存储的是该数组的初始地址,也就是说*p指向的是该数组的第一个元素(*(p+1)表示这个数组的第二个元素),但注意到这第一个元素还是一个地址,其相当数组b[0]的首地址,因此*(*(p3+1)+1)相当于*(b[1]+1),也就是b[1][1]

(*p)[3]改变了自然的运算符的优先级,相当于(int)((*p)[3])。一有指针就头疼,我们把指针先替换掉,就是int a[n],是一个n维数组,数组首地址(也就是数组名)是a。那么,int (*p)[n]也是一个n维数组,但是这个数组的首地址是*p,也就是说,p指向的内容,是一个数组的首地址。那么,p就是指向一个数组的指针,这个数组中的元素都是int。实际上,p3相当于一个二重指针,这个和**p其实差不多。

以上是我关于指针的一些个人理解,若有错误之处,希望广大网友指出,

参考博文:http://blog.csdn.net/ywb201314/article/details/52062059

你可能感兴趣的:(c语言指针*p,n个数排序)