指针

#include<stdio.h>
int main(void)
{
 int a=3,*p;
 p=&a;
 printf("a=%d,*p=%d\n",a,*p);
 *p=10;
 printf("a=%d,*p=%d\n",a,*p);
 printf("Enter a:");
 scanf("%d",&a);
 printf("a=%d,*p=%d\n",a,*p);
 (*p)++;
 printf("a=%d,*p=%d\n",a,*p);
 
 return 0;
}



                        指针的学习与体会
      在计算机中,所有的数据都是存放在内存中的,一般把内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不一样,如int占用4个字节,char占用1个字节。为了正确地访问这些内存单元,必须为每个内存单元编上号。每个内存单元的编号是唯一的,根据编号可以准确地找到该内存单元。内存单元的编号叫做地址(Address),也称为指针(Pointer)。

 1.指针类型分析 
分析指针,可以从变量名处起,根据运算符优先级结合,一步一步分析. 
int p;  //这是一个普通的整型变量 
int *p;  //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int 型.所以 P是一个返回整型数据的指针 
int p[3];  //首先从P处开始,先与[]结合,说明P 是一个数组,然后与int结合,说明数组里的元素是整型的,所以 P是一个由整型数据组成的数组 
int *p[3];  //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 int结合,说明指针所指向的内容的类型是整型的,所以是一个由返回整型数据的指针所组成的数组 
int (*p)[3];  //首先从P处开始,先与*结合,说明P是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针 

2.指针分析 
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。 
指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型 
指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型(在指针的算术运算中,指针所指向的类型有很大的作用) 
指针所指向的内存区:从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。(一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址) 
指针本身所占据的内存区:用函数sizeof(指针的类型)可以测出指针本身所占据的内存区(在 32位平台里,指针本身占据了 4个字节的长度) 
 
3.指针的算术运算 
指针和整数进行加减:一个指针 ptrold加(减)一个整数 n后,结果是一个新的指针ptrnew,ptrnew 的类型和 ptrold 的类型相同,ptrnew 所指向的类型和 ptrold所指向的类型也相同,ptrnew的值将比 ptrold 的值增加(减少)了n乘sizeof(ptrold所指向的类型)个字节。 
指针和指针进行加减:两个指针不能进行加法运算,这是非法操作;两个指针可以进行减法操作,但必须类型相同,一般用在数组方面。 
 
4. 运算符&和* 
&是取地址运算符,*是间接运算符。 
&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。 
*p的运算结果就五花八门了,总之*p 的结果是 p 所指向的东西,这个东西有这些特点:它的类型是 p指向的类型,它所占用的地址是p所指向的地址。 
 
5. 数组和指针的关系 
数组的数组名其实可以看作一个指针。 
声明了一个数组 TYPE array[n],则数组名称array就有了两重含义: 
第一,它代表整个数组,它的类型是 TYPE[n]; 
第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是 TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似 array++的表达式是错误的。 
 
6. 指针和函数的关系 
可以把一个指针声明成为一个指向函数的指针,从而通过函数指针调用函数。让我们举一个例子来说明以下吧。 
int fun(char *,int); 
int (*pfun)(char *,int); 
pfun=fun; 
int a=(*pfun)("abcdefg",7); 
例中,定义了一个指向函数fun的指针pfun,把pfun作为函数的形参。把指针表达式作为实参,从而实现了对函数fun的调用。

 
对以上编程理解如下
1.定义整形变量a和整形指针p :int a=3,*p;
2.把变量a的地址赋给指针p,即p指向a :p=&a;
3.输出变量a的值和指针p所指向变量的值 : printf("a=%d,*p=%d\n",a,*p);
4. 对指针p所指向的变量赋值,相当于对变量a赋值: *p=10;
5.将指针所指向变量加1 :(*p)++;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章