目录:
1.指向变量 4.指向函数
2.指向数组(遍历各元素) 5.指向结构体
3.指向字符串 6.空指针
______________________________________
指针中最重要的一点:
p代表指针本身,一般存放的是地址
*p则是出发到源数据域,等价于其指向的变量
1.指向变量
int main()
{
int a=10;
int b=15;
test(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
void test(int * x,int *y)
{
int tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
结果: a=15,b=10
原因:利用指针访问变量的存储单元,间接修改变量的值。
注意:
void main(){
int *p,n=123;
p=&n;
printf("%d",p);
}
若输出是p,是输出内存中 指针位置所存储的地址。
若输出是*p,则直接寻址到指向的变量位置,然后输出变量。
2.指向数组(遍历数组各元素)
【一维数组】
int main()
{
int array[5]={2,5,12,7,8};
int *p =array;
for(int i=0;i<5;i++)
{ printf("array[%d]=%d\n",i,*(p+i)); }
return 0;
}
解析:
(1)数组名就是数组的(首)地址,即*p=2。
(2)如果把(p+1),那么指针变量就指向了数组的下一个元素5。
【二维数组】
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++){printf("%2d ",*(*(p+i)+j))};
解析:
(1)指针中,通常*是优先级最低的识别符号。
(2)*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。
【数组的一种特殊写法:(查找数组中有无'k')】
main(){
char st[20],*ps;
int i;
printf("input a string:/n");
ps=st;
scanf("%s",ps);
for(i=0;ps[i]!='/0';i++)
if(ps[i]=='k'){
printf("there is a 'k' in the string/n");
break;
}
if(ps[i]=='/0') printf("There is no 'k' in the string/n");
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s/nstring b=%s/n",pa,pb);
}
解析:
(1)唯有数组输出的时候,指向它的指针能够不带*而加上[i]。
3.指向字符串
char *pc="C Language"
解析:
(1)原理与数组类似,指针变量指向字符串的首个字符。
(2)可以依次访问字符串的各个字符。
(3)这里意思是,指针pc指向一个存放"C Language"的位置,而不是为指针赋值。
main(){
char *ps="this is a book";
int n=10;
ps=ps+n;
printf("%s/n",ps);
} //对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st[]={“C Language”}。若非静态,只能逐个赋值。
解析:
(1)ps指向存储数组的首内存。
(2)ps+10后,是地址+10
(3)因为数组特性,数组的输出是一直自动输出到结尾。
所以这里输出会是"book"。
4.指向函数
int main()
{
int a=5;
int b=6;
int (*p)(int,int);
p=sum;
int result=(*p)(a,b);
printf("The result is %d\n",result);
return 0;
}
int sum(int x,int y)
{ return x+y; }
解析:
(1)(*p)(a,b)可以用p(a,b)来代替,因为p和sum就是一样的。
【指针函数】:
int *ap(int x,int y)
{
...... /*函数体*/
}
解析:
(1)表示ap是一个返回指针值的指针型函数, 它返回的指针指向一个整型变量。
(2)用法示例
main(){
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s/n",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day","Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday","Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}
5.指向结构体
struct student
{
char *name;
int ages;
};
struct student stu={"Rose",15};
struct student *p;
p=&stu;
解析:
可以有3种方式来访问结构体中的属性ages。
stu.ages=15;
(*p).ages=15;
p->ages=15;
注意:
第三种方法(->)只能用来指向结构体。
6.空指针
#define NULL 0
void main(){
int *p=NULL;
}
解析:
(1)指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。
(2)而指针变量赋0值后,表明它是空指针。可以使用,只是它不指向具体的变量而已。