关于C语言指针【第二季】

简介: 关于C语言指针【第二季】

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;

【关于怎么用二级指针引用就不说了】

相关文章
|
3月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
68 0
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
104 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
85 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
52 7
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
215 13
|
2月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
76 11
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
179 3
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
57 1

热门文章

最新文章