黑马程序员——C语言指针

来源:互联网 发布:长歌门捏脸数据 编辑:程序博客网 时间:2024/04/30 17:51

 ——- android培训、java培训、期待与您交流! ———-

在C语言中,指针占有一个非常重要的位置。所以,学号C语言,就必须学好指针这个变量。
下面,我就对指针这个变量进行详细的解读。

一.指针的概念

指针:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
在内存中,变量是这样表示的如

int a = 10 ;         //定义一个整型变量,赋值为10    

这句话,就在内存中做了如下的事情:

 地址     OX10变量名      a变量值     10 

一般来说变量的值都为数字、字符等内容,但是指针变量的变量值为一个地址。

int *p;    //定义一个指向整形的指针pp=&a;      //把a的地址赋予指针变量p
 地址     OX20变量名      p变量值     OX10          //a的地址

二.指针的类型

指针的类型就是指针地址所指向数据的类型。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。
类型:

  • 整型指针
int *ptr;           //指针的类型是int * 
  • 字符型指针
char *ptr;          //指针的类型是char * 
  • 指向指针的指针
int **ptr;          //指针的类型是 int ** 
  • 数组中的指针
int (*ptr)[3];      //指针的类型是 int(*)[3] 
  • 指向数组指针的指针
int *(*ptr)[4];     //指针的类型是 int *(*)[4] 

3.指针的基本运算

指针可用的运算为’+’,’-‘运算,每当指针加减时,并不是物理地址加减,而是加减的值乘以指针指向类型在内存中占用的物理空间的大小。即:

int a[2]={10,20};     int *p;             //指针类型为int  p=&a;               p=p+1;             //p实际增加量的为1*(sizeof(int))

4.’*’与’&’

说到指针,不得不提’*’与’&’这两个符号。

  • ‘*’可以理解为取地址所保存的值;
int a=10;int *p;p=&a;print("\n%d",*p);     //打印出来的是p指向a的值
  • ‘&’可以理解为取变量的地址;
int a=10;print("\n%d",&a);     //打印出来的是a的地址

‘*’与’&’是一对相反的运算:

int a=10;print("\n%d",*(&a);       //打印出来的是10,即  *(&a)=a

5.指针与数组的关系

当我们一遍这样定义一个数组:

int a[10];

其实当这样操作后,就相当于定义了一个整形指针指向了数组的第一个数。即:

a=&a[0];

所以,取数组中各元素,也可以用指针的方法:

int a[10]={0,1,2,3,4,5,6,7,8,9};int v; v=a[0];         //也可写成:v=*a; v=a[3];         //也可写成:v=*(a+3); v=a[4];         //也可写成:v=*(a+4); 

6.函数指针

可以把一个指针声明成为一个指向函数的指针。

int fun1(char*,int); int (*pfun1)(char*,int); pfun1=fun1; int a=(*pfun1)("abcdefg",7);//通过函数指针调用函数。 

可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为 实参。

int fun(char*); int a; char str[]="abcdefghijklmn"; a=fun(str); int fun(char*s) { int num=0; for(int i=0;i { num+=*s;s++; } return num; ) 

这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说 了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后 ,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是 str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。

以上就是我对指针要点的总结。

0 0
原创粉丝点击