C程序设计(谭浩强)--学习笔记 (指针)

指针运算符*指针变量说明符*的区别

在指针变量说明中,*是类型说明符,注意:对应的**也是类型说明符,最多是类型不匹配。表示其后的变量时指针类型。

表达式中出现的“*”则是一个运算符,用来表示指针变量所指的变量。


 指针变量的赋值运算有以下几种形式:
  ①指针变量初始化赋值,前面已作介绍。
  ②把一个变量的地址赋予指向相同数据类型的指针变量。例如:
               int a,*pa;
               pa=&a; /*把整型变量a的地址赋予整型指针变量pa*/ 
  ③把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如:
               int a,*pa=&a,*pb;
               pb=pa; /*把a的地址赋予指针变量pb*/ 
  由于pa,pb均为指向整型变量的指针变量,因此可以相互赋值。
  ④把数组的首地址赋予指向数组的指针变量。
            例如:
               int a[5],*pa;
               pa=a; (数组名表示数组的首地址,故可赋予指向数组的指针变量pa) 
  也可写为:
               pa=&a[0]; /*数组第一个元素的地址也是整个数组的首地址, 
  也可赋予pa*/
  当然也可采取初始化赋值的方法:
               int a[5],*pa=a; 
  ⑤把字符串的首地址赋予指向字符类型的指针变量。例如: char *pc;pc="c language";或用初始化赋值的方法写为: char *pc="C Language"; 这里应说明的是并不是把整个字符串装入指针变量, 而是把存放该字符串的字符数组的首地址装入指针变量。 在后面还将详细介绍。
  ⑥把函数的入口地址赋予指向函数的指针变量。例如: int (*pf)();pf=f; /*f为函数名*/


指针的加减

               int a[5],*p;

               pa=a;               /* pa指向数组a,也指向a[0] */

               pa=pa+2;        /* pa指向数组a[2],即pa的值为&pa[2] */

指针变量的加减运算只能对数组指针变量进行,对指向其他类型变量的指针变量作加减运算时毫无意义的。


NULL指针

NULL指针是一个无类型指针,并且值为0。


函数指针变量指针型函数

int (*p)();          //()表示p是指向函数入口的指针;

p=f;                  //p指向函数f;

z=(*p)(x,y);       //调用函数

        int(*p)()是一个变量说明,说明p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。

        int *p() 则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。

        对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。


指向二维数组的指针变量和指针数组

int (*p)[3]; 表示指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。

int *p[3]; p表示一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。


指针数组

                  name数组            字符串

name--->name[0]--->Follow me
 name[1]--->BASIC
p        --->name[2]--->Greate wall
 name[3]--->Fortran
 name[4]--->Computer
指针数组中的元素只能存放地址。


指针的数据类型总结

  表9.2

定义含义
int i;定义整型变量i。
if(条件)int *pIF(条件)p为指向整型数据的指针变量。
int a[n];定义整型数组a,它有n个元素。
int *p[n];定义指针数组p,它由n个指向整型数据的指针元素组成

int(*p)[n];p为指向含n个元素的一维数组的指针变量。
int f( );f为带回整型函数值的函数。
int *p( );p为带回一个指针的函数,该指针指向整型数据。
int (*p)( );p为指向函数的指针,该函数返回一个整型值。
int * *p;p是一个指针变量,它指向一个指向整型数据的指针变量。

二、指针运算小结

1、指针变量加/减运算

  p++、p--、p+i、p-i、p+=i、p-=i

  加1表示指向下一个数据。

   

2、指针变量赋值

  p = &a; 变量a的地址赋给p,即指针p指向a

  p = array; 数组array首地址赋给p

  p = &array[i]; 数组元素array[i]的地址赋给p

  p = max; 函数max的入口地址赋给p

  p1 = p2; 指针p2的值赋给指针p1,即p1、p2所指的数据相同

   注意:

  p = 1000;
  i = p; 

  int i;
  int *p = &i;
  *p = 100; 使p指向的数据(即变量i)等于100。

  char *p = "I love China!"; 使p指向字符串
    

3、空指针 p = NULL;

  空指针p=NULL表示p不指向任何数据。

  在stdio.h中,NULL被定义为0:#define NULL 0

  习惯上,不使用 p = 0
      
而使用 p = NULL

  指针变量p可以与NULL作比较,例、
       if (p == NULL) ...

    注意:空指针不指向任何数据,与p未赋值不同。当p未赋值时,其值是不确定的,而空指针的
          值是确定数0。

4、指针变量相减。

  当p1、p2指向同一个数组的元素,指针相假p2-p1等于p1、p2间的元素个数。
   

    注意:指针相加无意义。

5、两个指针的比较

 当p1、p2指向同一个数组的元素时,可以比较,如、p1 > p2。若p1、p2不是指向同一个数组的元素,比

较无意义。

三、空类型指针 void *

  void *p,表示p是空类型指针,它可以指向任何数据类型。

  空类型指针与其他类型指针之间赋值时,应进行强制类型转换,例:

    char *p1;
    void *p2;

    p1 = (char *)p2;
    p2 = (void *)p1;


结构体指针

        一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。

也就是说不允许取一个成员的地址来赋予它。因此,一下赋值是错误的。

        ps=&boy[1].sex;

而只能是:

        ps=boy;(赋予数组首地址)

或者是:

        ps=&boy[0];(赋予0号元素首地址)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值