C++ 之 第六课 指针和数组

c++语言中大部分程序都离不开指针和数组,所以,我们有必要弄清楚指针和数组。

  首先定一个字符数组char s[10];然后定义一个指向字符的指针char* p;数组用[]来申明,而*则表示指针。数组是以0作为下标开始,s有10个元素,从s[0]...s[9]。指针可以保存它的地址如:

p = &s[1];// 这句话表示了p指向了s的第2个元素。&是取地址运算符。

  那么指针到底是什么东西?为什么它会有如此大的魔力?如果你了解了汇编的基础知识。其实也不难理解?简单的解释就是它保存了一个对象的地址。这个对象是什么类型的,它也就保存了什么类型。如

char c = ‘a‘;

char* p = &c  //p保存着c的地址

如图所示:

我们在看看其他的类型的指针

int * p    //保存了int的指针

char** ppc   //到字符指针的指针(也就是2级指针)

int* ap[10];  //10个到int的指针数组

int(*fp)(char*);   //到函数的指针,这种函数以char*为参数

int* f(char*);    //有一个char* 参数的函数,返回一个到int的指针

  下面来理解以下最基本的指针操作

char c = ‘a‘;

char* p = &c;  //p保存了c的地址

char c2 = *p; //c2==‘a‘

  这里的p指向了变量c,而c所存的值是字符‘a’,那*p则保存了字符‘a’,而c2也是*p,所以c2也就等于‘a‘,这里c2做了一项隐蔽的工作,间接的把把地字符‘a‘给了c2。

还有一种特殊的指针就是空指针 char* c =null

它表示指针c没有指向任何对象,如果它某个系统中的运行程序地址,就会出现很可怕的错误!

  数组

数组也很重要,数组有一维数组和二维数组,甚至多维数组,数组的种类也很多,有字符数组,整形数组,浮点型数组。。。等等。举例说明:

float a[3];    //定义了一个浮点型数组,有3个元素,从a[0],a[1],a[2]结束,数组下标从0开始,到n-1结束。

其他类似不再一一举例说明。我们再来看看一些错误的例子:

int v[i];   //这里的i不能为变量,数组的大小必须是常量表达式

int v1[5,2]  //这里定义错误,逗号不能出现在常量表达式中。

  数组的初始化

int v1[]  ={1,2,3,4};

char v2[] = {‘a‘,‘b‘,‘c‘,0};

  当数组中没有给出数组大小,但是初始化时的大小可以通过列表中的元素个数确定,v1和v2的个数都为4个,其中v1是int类型,v2是char类型。

  初始化时经常犯的一些错误

如 char v = {‘a‘,‘b‘,0};   //这里的v不是数组。

  字符串数组

  char* p = "plato";

  p[4] = ‘e‘   //错误,不能将常量赋值

如果希望字符串能够被修改我们可以将字符复制到数组中

  char p[] = "zero";    //p 是5个char的数组

  p[0] = ‘R‘;    //正确

  数组的指针

  在c++中,指针和数组密切相关,一个数组的名字可以作为开始元素的指针如:

  int v[] = {1,2,3,4};

  int* p1 = v;

  int* p2 = &v[0];

  int* p3 = &v[4];

  这样是允许,,它取得超出了一个数组结束之后的一个元素位置的指针。当然,这个指针事实上并不指向数组中最后一个元素。因为不能通过它读和写。这里一定要注意就行了!

  c++指针和常量

  常量指针用const来修饰,如 const int* p; 这里的*p一旦被定义后其值是不能被修改的。举例说明:

  void f(char* p)

{

  //1种情况

  char s[] = "Gorm";

  const char* ps = s;  //指向常量

  ps[3] = ‘a‘;   //错误  常量不能被赋值

  ps = p;      //正确

//2种情况

  char *const ps = s;   //这是一个常量指针

  ps[3] = ‘a‘       //正确

  ps = p;      //错误 因为ps是一个常量指针

  //3种情况

  const char* const ps = s;    //到const的const指针

  ps[3] = ‘a‘;      //错误 ps是一个指向常量

  ps = p;    //错误,ps本身是个常量。  

}

  指向Void的指针 

void类型的指针就是任何对象的指针都可以指向void类型的指针,这句话听起来很拗口,我们来一个实例具体分析

  void f(int* p)

{

  void* ps = p;   //正确   从int* 到void*是可以的

  *ps;    //错误 void* 不能间接使用

  ps++;       //错误 void* 因为ps没有指向对象的大小

} 

  要想学好C++中指针需要大量的练习,从错误中寻找经验,分析原因,只有这样,才能不惧怕指针。因此,我们更应该去努力的学会它,为我们学好Windows编程打下坚实的基础~~~~

时间: 2024-10-12 10:16:51

C++ 之 第六课 指针和数组的相关文章

第29课 指针和数组分析(下)

1. 数组的访问方式 (1)以下标的形式访问数组中的元素:如a[i]; (2)以指针的形式访问数组中的元素:如*(a+i) 2. 下标形式 VS 指针形式 (1)指针形式以固定增量在数组中移动时,效率高于下标形式 (2)指针增量为1且硬件具有硬件增量模型时,效率更高 (3)下标形式与指针形式的转换:a[n]==*(a+n)==*(n+a)==n[a]; ▲注意: ①现代编译器的生成代码优化率已大大提高,在固定增量时,下标形式的效率与指针形式相当: ②但从可读性和代码维护的角度看,下标形式更优 [

第28课 指针和数组分析(上)

1. 数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 [编程实验]a + 1的结果是什么?  (答案是第2个元素的地址) #include <stdio.h> int main(){ //将数组每个元素初始化为0 int a[5] = {0}; int* p = NULL; printf("a = 0x%X\n",(unsigned int)(a)

第十六课 数组的引入 【项目1-5】

第十六课 数组的引入 项目一 [数组大折腾] (1)创建一个有20个元素的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行. [cpp] view plain copy print? int main( ) { int a[20]={...};  //初始化前10个元素 //键盘输入后10个元素的值 //由前往后输出数组中所有元素的值 printf("由前往后,数组中的值是:\n")

C语言学习笔记(六) 指针和数组

使用C语言就必然会使用到指针和数组.看下面的代码: int main(int argc, char** argv){     int a[4] = {1,3,5,7};     int *p = a;     int i;     for (i=0; i<4;i++){         printf("i=%d, p[i]=%d, *(p+i)=%d, a[i]=%d, *(a+i)=%d\n",                 i, p[i], *(p+i), a[i], *(

【C语言探索之旅】 第二部分第六课:创建你自己的变量类型

0 内容简介 1.课程大纲 2.第二部分第六课: 创建你自己的变量类型 3.第二部分第七课预告: 文件读写 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量

BeagleBone Black板第六课:C++编程控制GPIO基础

BBB板第六课:C++编程控制GPIO基础 在一上课我们通过Shell脚本编程实现了对GPIO端口的简单输出控制,实现对两个LED指示灯的交替点亮和关闭,接下来的一两节课,将通过C++程序来实现Shell脚本的功能.为了实现对应的程序控制,我查阅了好多资料,测试过程中发觉网上的一些程序套用过来总是出现各种各样的编译错误,压根就控制不了BBB板,不知是我的BBB板太新,还是以前的程序太旧.最后还是从头开始,重新研究BBB板的文件系统,找出头文件,找出所有相关的函数,终于实现GPIO的C++程序控制

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

NeHe OpenGL教程 第六课:纹理映射

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第六课:纹理映射 纹理映射: 在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多个多边形来构建

【C语言探索之旅】 第一部分第六课:条件表达式

内容简介 1.课程大纲 2.第一部分第六课:条件表达式 3.第一部分第七课预告:循环语句 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动