概览
指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面:
什么是指针 数组和指针 函数指针
什么是指针
存放变量地址的变量我们称之为“指针变量”,简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a。当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为“直接引用”;而当我们通过p取得a的时候首先要先根据p转换成p对应的存储地址,再根据这个地址到其对应的存储空间中拿到存储内容,它的内容其实就是a的地址,然后根据这个地址到对应的存储空间中取得对应的内容,这个内容就是a的值,这种通过p找到a对应地址再取值的方式成为“间接引用”。这里以表格形式列出a和p的存储以帮助大家理解上面说的内容:
接下来,看一下指针的赋值
//
// main.c
// Point
//
// Created by Kenshin Cui on 14-7-05.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a=1;
int *p;
p=&a; //也可以直接给指针变量赋值:int *p=&a;
printf("address(a)=%x,address(p)=%xn",&a,p); //结果:address(a)=5fbff81c,address(p)=5fbff81c
printf("a=%d,p=%dn",a,*p); //结果:a=1,p=1
*p=2;
printf("a=%d,*p=%dn",a,*p); //结果:a=2,p=2
int b=8;
char c= 1;
int *q=&c;
printf("address(b)=%x,address(c)=%xn",&b,&c);//结果:
printf("c=%d,q=%dn", c, *q); //结果:c=1,q=2049,为什么q的值不是1呢?
return 0;
}
需要说明两点:
a.int *p;中的*只是表示p变量是一个指针变量;而打印*p的时候,*p中的*是操作符,表示p指针指向的变量的存储空间(当前存储就是1),同时我们也看到了*p==a;修改了*p也就是修改了p指向的存储空间的内容,也就修改了a,所以第二次打印a=2;











