C指针小结

来源:互联网 发布:数据库物理设计问题 编辑:程序博客网 时间:2024/05/01 05:31

1、二维指针的用法说明
a[i]从形式上看是a数组中的第i个元素。
如果a是一维数组,则a[i]代表a数组第i个元素所占的内存单元的内容。a[i]是有物理地址的,是占内存单元的。
但如果a是二维数组,则a[i]是代表一维数组名。它只是一个地址(如同一维数组名只是一个指针常量一样)。a,a+i,a[i], *(a+i), *(a+i)+j, a[i]+j都是地址。*(a[i]+j)和*(*(a+i)+j)是二维数组元素a[i][j]的值。
举例说明:
int a[3][4] = {1, 2, 3 };
a,*a; 第0行首地址和0行0列元素地址
a[0],*(a+0); 第0行0列元素地址
&a[0],&a[0][0];第0行元素首地址和0行0列元素地址
a[1],a+1; 第1行0列元素地址和1行首地址
&a[1][0],*(a+1)+0; 1列0行元素地址
a[2],*(a+2);2行0列元素地址
&a[2],a+2;第2行元素首地址
a[1][0],*(*(a+1)+0);第1行0列元素的值。

int a[2][3] = { 177, 19, 23, 10, 15, 6 };
int **  p;
p = (int **)a;
printf("*p = %d/n", *p); //177
printf("*(p+1)=%d/n", *(p + 1));//19
printf("*p + 1 = %d/n", *p + 1); //177+sizeof(int),因为*p是指针,+1此时指针下移一个位置。

2、除了多维指针外,比较容易混淆的还有:
[1]指针常量与常量指针。
指针常量是指针是常量,但其指向的数据可变。而常量指针则是指针指向的数据不可变,而指针本身可变。声明的方式分别是:
指针常量:Type * const pointer;
常量指针:const Type *pointer; 或者Type const* pointer;
[2]函数指针和指针函数
函数指针:指向函数的指针,可以指向一个函数;指针函数:返回指针的函数;声明的方式是:
函数指针:Type (*p)(形参列表); 例如:
int func(int x);  /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func;           /* 将func函数的首地址赋给指针f */
指针函数: Type *function(形参列表);
指针函数比较简单,但是要注意不要返回局部变量的地址,否则局部变量析构,导致指针悬挂。如果函数内部有分配空间,调用者需要负责回收资源。例如:
int *function()
{
    int data[3] = { 1, 2, 3 };
    return data;
}
[3]指向数组的指针和指针数组
指向数组的指针:<类型说明符>(*<指针名>)[<大小>]
指针数组:<类型名>*<数组名>[<大小>]
int (*pa)[2];//pa是一个指向一维数组的指针,该数组有2个元素,每个元素都是一个int;
int *pb[3];//pb是一维数组指针名,该数组有3个元素,每个元素是一个int*;
*(pb+i), pb[i]; 数组pb的第i个元素,每个元素都是int*
int a[2][3];
pa = a;

原创粉丝点击