指针的使用
1.注意:一定要在对指针应用解除应用操作符(*)之前,将指针初始化为一个确定的地址。
例子:
#include<stdio.h>
Int main()
{
Int a;
Int *p;
/*****************指针的错误用法:对没有指向确定的地址*******************/
*p=10;
/************************************************************************/
//正确使用方法
P=&a;
*p=10;
}
C++中还可以使用new来给指针确定地址。
例子:
#include<iostream>
Int main()
{
Int a[4]=new int[4];
Int i=0;
For(i=0;i<4;i++)
a[i]=i;
Delete[] a;
}
2.二维数组指针定义:
对于int **p来说,p所指的对象是指针,那么++p就是让p的值增一个指针的大小,虽然指针所指对像可大可小,但是指针自己的大小却是一定的,目前的系统上一般是4字节(64位系统我没用过,可能是8字节)。也就是说,对char *p和long *q来说,p和q本身占内存容量是一样大的(虽然char和long占内存不一样大)。
很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:
int a[2][3];
int **p = a;//错误
这个代码的错误之处在于a是一个数组,它的成员也是数组,所以a叫做“数组的数组”——C++中严格说来没有二维数组。那么,你要用一个指针来记录a,就要用一个能表示“数组的数组”的指针,以下代码是正确的:
int (*p)[3] = a;//正确
只有这样才能保证++p使p指向a的下一对像(该对像是一个数组)。
顺便提一句:不要写成“int *p[3];”
int *p[3];//定义p[3]为指针数组
int (*q)[3];//定义q为数组指针
int a[4][3];//定义一个二维数组
3.指向指针的指针
#include<stdio.h>
Int main()
{
Int a[5]={1,3,5,7,9};
Int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; //定义一个指针数组
Int **p,i;
P=num;
For(i=0;i<5;i++)
{
Printf(“%d”,**p);
P++;
}
Printf(“\n”);
}
4.指向函数的指针
#include<stdio.h>
Int (*p)(int,int);
Int printf_one(int,int);
Int printf_two(int,int);
Int main()
{
P=printf_one;
P(1,2);
P=printf_two;
P(3,4);
}
Int printf_one(int a,int b)
{
Printf(“输出a:%d,输出b:%d\n”,a,b);
}
Int printf_two(int a,int b)
{
Printf(“输出a:%d,输出b:%d\n”,a,b);
}