指针与数组、函数、结构体等之间相关问题

                                           指针相关问题


一:指针
1指针:指针就是地址,地址就是指针,指针是虚拟的,地址是真实存在的。
2.如何判断语句是何种类型:
      int p;                       p是基本的整型。
      int *p;                      p和*结合说明p是一个指针,类型是int* ,指向是int类型。
      int p[5];                    p和[]运算,说明p是一个数组,并且数组中元素是int类型。
      int *p[5];                  p和[]先结合,说明p是一个数组,再和*结合说明数组里面的元                                          素是指针 并且指向int类型。P是一个返回int类型的指针的数组。
      int(*p)[5];                 p和()结合,说明p是一个指针,指向int类型的数组,p是一个                                          指向整型数组的指针。
      int *p ;                     p是一个指针,指针指向的内容,又是一个指针,指向一个int类                                           型数据。
      int p(int);                  p是一个函数,函数形参是int类型,函数返回值是int类型。
      int (*p)(int);              p是一个指针,指向函数,函数的形参是int型,返回值是int类                                              型,p 是一个指向形参为int返回值为int函数的的指针。
      Int p(int *);               p是一个函数,函数的形参是指向int类型的指针,返回值是int类                                           型   P是一个形参为指向int类型的指针返回值是int的函数。
      int *( * p ( int ) ) [3]; p是一个函数,函数是形参是int返回值是指针的, 该指针指向数                                        组,数组中的元素又是指针,指向int类型。
  总结 1.先确定p的类型,与* 与()与[],可以确定指针,函数,数组 类型。
                2.结合时候的优先级()> [] > *。
                3.函数指针 ,指针函数,数组指针, 指针数组,重点落在后两个汉字。

二:指针分类
1.指针类型 ,指针指向:
         int * p; P是一个int* 类型的指针,指向int;
         int **p; p是一个int** 类型的指针, 指向int*;p是一个二级指针指向地址的地址 指针的指针就是地址的地址;
         int * (* p) [4]; p是一个int*(*)[4]的类型的指针(sizeof*(*)[4] = 4),指向int *()[4];
总结: 指针类型:去掉名字。
            指针指向:去掉名字和左边*。
2.指针的值 指针所占内存:
     a.指针的值:存放一个地址。

     b.指针所占内存: 系统给指针自身也要开辟空间,占四个字节(在32编译环境中指针占4个字节)。


三 指着运算

1. 指针可以进行整数的加减,但和平时加减有天壤之别。


2. 指针的加减就是指指针所指向的位置右移 左移。
    char a[20];
    Int *prt = (int *)a;//  (int *)是强制类型转换,数组名是一个指针既地址。
    ptr+5;//            ptr指向数组,ptr存放了a的地址,a的地址就是数组首元素的地址,所以     ptr存放了首元素地址,ptr指向首元素,所以它是一级指针。+5,就是行操作,又因     为是指向int所以是四个字节,一个单位,故ptr+5,指向字符数组第二十个元素。
注意:a.字符数组在C++有特殊待遇,要输出array[],就必须先强制转换(void *)。

           b. 数组名是指针(array = * ptr 一级指针)其地址就是首元素地址。




3.2级指针进行加减毫无意义

     int ** p =&q;

     p+4;//这是一个非法的操作,指针变量p是一个二级指针。

4. 指针和指针进行加减:指针不能进行加法运算,可以减法操作,但类型必须相等(一     般用在数组)。

5. 运算符&和*:
     这里&是取地址运算符,*是间接运算符(指针运算符,也是取值运算符)。
     &a 的运算结果是一个指针,地址就是指针,指针类型*a。
     *p 运算结果五花八门,指针可以指向整型,指针,数组,函数等,其本质:是它的        类型是其指向的类型,它所占用的地址是p所指向的地址。

四 指针和数组:
1.指针
         int *str;指针变量str 加减就是左右加减,注意只能对一级指针进行左右加减。
    对数组的话也就行加减如果是多维数组看成一维数组的数组。
    str ---------------》指向str首元素。
    str + 1 ----------》指向str第二个元素,行运算。
    *(str +1)--------》取出str第二个元素,*是取址运算符,取出第二个元素。
    *str +1----------》值运算 ,取出第一个元素的值再+1。

2.数组名:

         两个含义:a.代表的类型是Type类型的数组。

                        b.一个指针常量;他是一个Type*的指针指向Type 。

        数组名的特点:数组名是一个常量指针,数组名的自身地址 = 首元素的地址。
3. 数组名有关的sizeof:
 ----->sizeof(array) 是数组本身的字节大小,不能当做求指针字节大小的运算符。

 ----->sizeof(array +n) 是指针大小 指针占四个字节。

 ----->sizeof(*array) 是取值运算 也是指针指向 ,数组array指向第一个单元的大小既等            于sizeof(*(array+0)) = sizeof(a[0])。

     



注意:   由上例子可以看出若只是给数组名求大小,其实就是给数组求大小,和指针没            关系;
              如给数组成员求sizeof 要用取值运算符* ,*(array+1)就是第一个元素的大              小; 若要求数组指针的sizeof 可以用sizeof(array +n) = 4; n 可以是0,要求指针          必须写上不写0 ,就是求数组大小 这是一个规定,,就是区别当sizeof数组名时              候,有+是指针,没有+ 是数组 ,可以清楚到底是求哪一种sizeof

五 指针和结构体

            定义结构体之后 构造一个对象,给对象初始化就是实例化对象(对象类似于数        组,但和数组有本质的差别,因为数组是同一类型的数据集合,而结构体可以存放不      同类型的数据)。

             可以构造一个结构体的指针 其初始化就是对象的地址,这个取地址符&不能省        缺,类似数组,却没有数组名的功能 要访问对象中的成员,可以构造一个指针,三         种方法:

           a.用成员访问符. (ss.a)

           b.用指针指向符-> (ptr->a )取值符->

           c.可以用(*ptr).a 相等于(*ptr)就是取出指针ptr指向的对象ss再通过成员访问               符,访问成员。

                 


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值