以下是我个人对“指针”的知识点的收集,整理,还有理解,不保证都是对的,请大家带着“怀疑”的态度参考
如果大家发现有不对的地方请留言,我会圈出来,以免误导大众。
1、概念
指针:用来存放地址的一种数据类型,并且只能存放地址(我个人理解);
也有大牛讲“指针就是地址,地址就是指针”;
指针变量:存放变量地址的变量就是指针变量;
晕了没?吐血没?实在不明白你就记住,“指针”和“指针变量”是两个不同的概念。
我们平时讨论“指针”其实是“指针变量”,只是大家为了偷懒,习惯省略两个字,所以才导致我们“指针”,“指针变量”傻傻分不清楚。
2、解说
下面是帮助大家理解的解说,慢慢读,慢慢理解。
一个变量的地址称为该变量的“指针”;
一个变量A专门用来存放另一个变量B的地址,则称变量A为“指针变量”;
指针变量的值是地址,即指针变量A中存放的值是变量B的地址;
3、定义
基类型 *指针变量名;
基类型 :用来指定该指针变量可以指向的变量的类型;
“*” 星号,表示该变量的类型为指针型变量;(初学者不要纠结这个小星星的位置)
4、一些例子
//&:取地址运算符, &a,取变量a的地址;
//*:指针运算符,*p为指针变量p所指向的储存单元;
/*正确示例*/
int a,b;
int *pt,*qt;
pt = &a; /*把变量a的地址赋给pt*/
qt = &b; /*把变量b的地址赋给qt*/
/*错误示例*/
int *point;
point = 100;(point 是指针变量,100为整数)
/*指针变量中只能存放地址(指针),不要将一个整形量(或任何其他非地址类型的数据)赋给一个指针变量*/
/*脑筋急转弯*/
int a;
int *pt;
pt = &a;
/*
问题:&*pt是什么?
解析:'&' and '*' 两个运算符的优先级别相同,但按自右而左方向结合,因此先进性 *pt的运算,它就变量a,
在执行&运算。因此,&*pt与&a相同,即变量a的地址
*/
5、一道比较好的面试题
指针和引用的区别?
写了半天,感觉啥也没说清楚。。。唉。。。
2012.8.18,周六补更。早上去爬山,刚吃过午饭,有点累,有点困。
#include<stdio.h>
int main(void)
{
int x, y, t; //定义三个整型变量
int *p, *q, *r; //定义三个整型指针变量
/*
**很多同学在这里会说“定义三个整型指针”,其实我们平时的说法是错的,指针是地址,地址是指针;
**另外,再强调一下‘*’的位置,这里p,q,r前都加了‘*’,不能写成int *p,q,r;这样写q,r被定义成了整型变量;
*/
x = 100;
y = 200; //给x,y赋值
p = &x; //把x的地址赋给p, 所以 *p 的值是 100
q = &y; //把y的地址赋给q, 所以 *q 的值是 200
printf("x = %d, y = %d, *p = %d, *q = %d\n",x,y,*p,*q);
//第一次交换
t = x;
x = y;
y = t;
//此时*p,*q的值格式多少?如果有疑问就把代码运行一下,不要稀里糊涂
printf("x = %d, y = %d, *p = %d, *q = %d\n",x,y,*p,*q);
x = 100;
y = 200; //重新给x,y赋值
//第二次交换
t = *p; //p中保存着x的地址&x, *p中的值即为x, 是整型变量,故可以赋值给整型变量t
*p = *q;
*q = t;
//此时x,y的值格式多少?
printf("x = %d, y = %d, *p = %d, *q = %d\n",x,y,*p,*q);
x = 100;
y = 200; //重新给x,y赋值
//第三次交换
r = p;
p = q;
q = r;
//此时x,y,*p,*q的值格式多少?为什么?
printf("x = %d, y = %d, *p = %d, *q = %d\n",x,y,*p,*q);
}
/*
**程序中进行了三次交换,大家明白这三次交换是交换的什么吗?
**第一次交换和第二次交换有相同的结果,都是对变量x,y的交换。
**而第三次交换则是对指针变量p,q的交换,x,y的值不变。
*/
/*
**指针的大小
**C语言中,不同类型的数据占据不同数目的内存单元。
**那么,指针作为一种可以存储变量地址的数据类型,它的大小是多少呢?
**指向不同类型的指针变量其大小与其所指向的数据类型有什么关系吗?
**看程序!!!
*/
#include<stdio.h>
int main(void)
{
char ch;
int i;
float f;
double d;
char *ch_point;
int *i_point;
float *f_point;
double *d_point;
printf("char : sizeof(ch) = %d, sizeof(ch_point) = %d\n",sizeof(ch),sizeof(ch_point));
printf("int : sizeof(i) = %d, sizeof(i_point) = %d\n",sizeof(i),sizeof(i_point));
printf("float : sizeof(f) = %d, sizeof(f_point) = %d\n",sizeof(f),sizeof(f_point));
printf("dbouble : sizeof(d) = %d, sizeof(d_point) = %d\n",sizeof(d),sizeof(d_point));
}
从运行结果来看,指针的大小与其所指向的数据类型没有关系,即指向不同变量类型的指针变量本身占据相同数目的内存单元,这点与C语言中其他普通变量不同。
Why ???因为无论指针指向什么类型的目标,它们都是存储该目标的内存单元的首地址。而地址的长度在一个计算机系统中是固定的,它取决于该计算机系统的中央处理单元的地址空间的大小。
那么,指针的数据类型有什么作用呢?看这里http://blog.csdn.net/linan_nwu/article/details/7880977
内容比较简单,但仍旧希望有帮到你。我还在继续看,会继续更新的~~