博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于C语言指针【第二季】
阅读量:6543 次
发布时间:2019-06-24

本文共 1908 字,大约阅读时间需要 6 分钟。

6.指针数组
    指针不仅可以指向一个数组,而且可以作为数组的元素,形成一个指针数组。
    char *ptr[5];
    由于在解释变量的类型时,由于[]的优先级高于*,所以应先解释[]。则这句的含义是:ptr是有5个元素的数组,每一个元素是一个指向 char类型的数据的指针。
   
 ***【注意】**
我们可以对比一下(5)中的char (*p)[5];先解释*,意思是数组*p有5个char类型的元素他们分别是(*p)[0],(*p)[1],......,所以呢p就  
    指向了5个char型的一维数组。p为行指针。
    
【注意变量声明时符号的解释顺序】
     ......................................
    **指针数组比二维数组更常用,有效,方便,尤其是在设计字符串数组时。
    例如:char str[5][5]={"aaa","bbb","cccc","dddd","eeee"};
          char *ptr[5]={"aaa","bbb","cccc","dddd","eeee"};
     虽然str和ptr都代表了第i+1个字符串的首地址,可是含义却不同。
     str代表了一个真正含义上的二维字符数组,str是数组名。编译时要分配5*5*sizeof(char)个字节的内存空间。可是对于ptr只需分配5个 用于存放char型指针的内存单元即可,在初始化ptr时,我们把花括号里面的5个字符串的首地址赋值给了5个char型指针即5个ptr里面的元素。
     在用指针数组存储字符串的首地址时,各个字符串不占有连续的内存单元。
7.二级指针(指针的指针) char **p;
     首先p是一个指针,该指针指向的内存单元中存放的也是一个指针,这个指针指向了一个char型变量。
     char a='m';char *b=&a;char **c=&b;
     a=='m';*b=='m';**c=='m';
    【用二级指针对二维字符数组的编程操作】
     char *str[5]={"aaa","bbb","cccc","dddd","eeee"};
     char **p;
     p=str;
     cout<<*(*(p+2)+2);【哈哈,这一点是不是和(5)中的行数组指针很像啊?】
8.带参数的main()
   略....
9.动态数组实现
   略....
10.用const修饰指针变量(此问题曾经相当纠结)
   关键字const限定一个变量不允许被修改。就是说变量一旦被赋值,在下面就不能在修改变量了。书上说是为了提高安全性。
   指针本身和指针指向的变量都可以声明为const但是const放的位置不同,含义也就不同。
   (1)放到类型关键字的前面  const int *p=&a;
      说明*p是一个常量,是只读的,注意:p不是。。这一点又牵涉到了变量声明时的解释顺序问题(详细内容看上面)。在这里,const限定的是*p,也就是也就是说不能能再用*p=..;来对p指向的变量进行修改。
   (2)放到类型关键字的后面和*变量名的前面   int const *p=&a;
      此时const限定的也是*p这个和第一种情况是等价的。
   (3)放到类型关键字*的后面和变量名的前面   int* const p=&a;
      此时const限定的是p,即指针p是只读的,不能在改变p的指向。并且这种状况下,只能在声明变量时对p进行初始化。而不能写成 int* const p;p=&a;
   (4)两个const:   const int* const p=&a;
      同上联想可得,p和*p都是只读的。按照从右往左的顺序,可读做:p是一个不可被修改的指针,p所指向的也是一个不可用*p=..;的方法修改的数。
【补充点函数指针】
11.函数指针
     函数指针本身也是个指针,只不过它指向的不是一个变量,而是一个函数。一个函数再内存中也占有的有一定的内存,同理,也有一个“
首地址”叫做函数入口,用一个指针来指向这个入口,这个指针就叫做函数指针。
     函数指针的作用有:调用函数和做函数的参数。
     声明方法:数据类型标志符 (指针变量名) (形参列表); 
     例如
         void fuc1(){cout<<"1";}  
        void main()
        {
         void (*p)();
         p=fuc1;
         p();
        }
   既然是一个指针我们当然可以用一个指针数组 来保存不同函数的入口
   void (*fuc[2])();  fuc[0]=fuc1;  fuc[1]=fuc2;
   【关于怎么用二级指针引用就不说了】

转载于:https://www.cnblogs.com/zzili/archive/2012/12/06/6663404.html

你可能感兴趣的文章
ssh整合
查看>>
TYVJ P1046 Blast Label:dp
查看>>
linux命令--virtualenv
查看>>
11g新特性与12c新特性
查看>>
查看哪些表的哪些列含有指定字符串(如‘andy’存在哪些表的哪些列中)
查看>>
kafa单机版环境搭建
查看>>
BZOJ-3894 文理分科 最小割
查看>>
GDB 单步调试汇编
查看>>
SQLAlchemy 几种查询方式总结
查看>>
性能测试工具之安装webbench
查看>>
解决Sencha Touch 2 MVC部署App.json不被识别问题
查看>>
zabbix web端有数据但是没有图形
查看>>
[bzoj 1758][Wc2010]重建计划
查看>>
[PHP相关教程] laravel5.1学习手册[一]基本开发环境配置
查看>>
原生 JS 实现手机验证码倒计时
查看>>
关于产品运营的一些思考
查看>>
Tips For Your Maya Plugin Development
查看>>
数据库设计
查看>>
[转]ubuntu下gcc的安装与使用
查看>>
Spreading the Wealth uva 11300
查看>>