数据结构----数组和指针

大概介绍1.  数组(一维数组,多维数组,字符数组与字符串);

  2.  指针;

  3.  数组与指针(一维,二维,字符串,数组指针,指针数组,指向指针的指针);

  4.  函数与指针。

1.数组

一维数组

定义:数据类型   数组名  [常量表达式]
不允许对数组大小进行动态定义,即常量表达式不可以包含变量。
数组名是数组首元素的内存首地址。一维数组是按照下表的顺序连续存储的。

初始化:将初始值按照顺序放入{}中,数值间用英文逗号分隔;若初始数值数目少于数组元素数目,数组剩余元素会被自动初始化0;此外,对全部的元素赋值,不用指定数组长度 。eg:int a [ ]={1,2,3,4,5};

数组元素的引用:通过下标加以区分。

C++中设置对齐的标志为左:
#include<iomanip>加上
cout.flags (ios::left);//再配上设置数据的域宽使输出更工整,setw()


多维数组(主要是二维)

定义: 数据类型 数组名  [常量表达式][常量表达式]
可将二维数组看作一种特殊的一维数组,即他的元素又是一个一维数组。
二维数组存储结构是“按行线性展开,顺序存放”

初始化:初始值的排列顺序要与元素存储顺序一致;若对全部元素赋初值,第一个下标可以省略;也可对部分元素赋初值,则剩余其他元素均初始化为0。
赋初值时,可对同一行的元素用{}括起来,其中可对某一行的某些元素赋值,也可只对其中某几行赋初值。
数组元素的引用:通过下标加以引用。
三维数组的性质与二维相似。

判断某一年是否是闰年的依据:被4整除却不能被100整除,或者是能被400整除。
 (原因)地球绕日运行周期即一个回归年是365天5小时48分46秒(合365.24219天),公历把一年定为365天,所以计算起来,每400年会多出97天,也就是说,要设置97个闰年。而每4年设一个闰年,400年会有100个闰年,就多出3个闰年。为了解决这个问题,除了规定“能被4整除”这个条件外,还规定“凡是整百的年份,要能被400整除”的才算闰年。如此规定,刚好满足了400年中设97个闰年的客观规律。
(应用)已知日期,求解日期是该年的第几天。(可通过二维数组将平年与闰年相对应的月份的天数都先保存下来,当判定是否为闰年后,通过表格查询相应月份天数,再进行累加即可【查表法】)。


字符数组与字符串

将数组的数据类型变为字符型即字符数组。
用双引号括起来的字符序列即字符串。
一个长度固定的字符数组可存放不同长度的字符串,为了便于识别字符串末尾,约定字符串末尾以转义字符'\0'(空字符,ASCII码为0)作为结束标志。

初始化:可采用字符初始化,也可采用字符串初始化。
用字符串的方式赋值比用字符逐个赋值要多占1个字节,该字节用于存放字符串结束标志。赋值时,字符串的长度应小于或者等于字符数组的大小减1.

字符数组元素引用同用下标。也可使用数组名。

字符串处理函数
存储在字符数组里的字符串不可直接进行字符串见得赋值与连接等操作,通过系统函数来查询字符串的长度,进行字符串的复制与比较等,包含在<string.h>
1.strcpy(sto,sfrom)  字符串拷贝函数

sto:字符数组名或者字符指针名,维数应当足够大,以便保存包含在sfrom中的字符串;
sfrom:字符数组名或者字符指针名还可是字符串常量;

2.strcat(s1,s2)  字符串连接函数
s1;字符数组名或者字符指针名;
s2:字符数组名或者字符指针名还可是字符串常量;
将s2添加到s1的末尾,不修改s2。返回值为数组s1的首地址。

3.strcmp(s1,s2)字符串比较函数
s1,s2:字符数组名或者字符指针名还可是字符串常量。
从左至右,逐个字符,比较ASCII码。
s1>s2,返回正整数;s1=s2,返回0;s1<s2,返回负整数。

4.strlen(s)字符串长度函数:指的是字符串中有效字符的个数,不包含'\0'在内。
s字符串常量,数组名。

c++中,有一标准串类模板,包含在头文件“string”中,无“.h”后缀。此类重载了运算符,进行连接,索引,复制等操作时无需使用函数,使用方便,不易出错。

2.指针

指针:变量,数组,函数的内存地址。
指针变量:专用于存放内存地址(即指针)的变量。
引入指针变量的目的:提供一种对变量进行间接访问的手段。指针变量必须先说明后引用。

指针变量定义:数据类型 * 指针变量名
指针变量只能用于存放指定类型数据的地址。

初始化:类型 * 指针变量名=内存地址;
指针变量不能直接赋以具体地址值,不能从键盘输入值。指针变量通过间接赋以相关数据的地址,或调用存储空间分配函数得到的值。
指针变量在使用前必须先复制再使用,否则,运行时会出现不看人预见的错误。若没有具体明确的变量地址要被赋值,可以先赋值NULL。

指针的运算实质是地址的运算。
&指针变量,得到的是指针变量本身的地址。
指针变量“加上”或“减去”一个整数N,相当于指针变量加上去或减去N个指针所指向数据的存储单位,即指针由当前位置向前或向后移动N个指针所指向的数据存储单元。
两个指针相减可以得到两指针间数据的个数,一般用于数组处理。


指针的关系运算通常指的是相等或者不等的判定,来说明是否指向同一个位置。


3.指针与数组

指向数组的指针

一维:若已知数组第一个元素的地址,并将其存储在某个指针变量中,那么对数组元素的访问可以转换为指针操作。
声明一个数组时,C++语言将在内存中开辟两个空间,一个用于保存数组元素,一个用于保存数组元素的第一个地址。数组名就是用于保存数组第一个元素地址的指针型常量。
指针变量是变量,在程序运行时可以发生变化,二数组名是指针常量,不可改变,只能是固定地址,不能将一个指针
值赋值给数组名。


检测素数的方法:一个数不能被比他小的任意素数整除,则必然是素数。显然最初知道的两位素数是2,3。


多维(二维)
首地址:数组名,成为二维数组的指针。  
行首地址:二维数组中某一行的首地址,每行相当于一个一维数组。
元素地址:二维数组具体分量的地址。

eg:a[n][m],a是二维数组首地址,也就是第0行的首地址;*a表示第0行首地址;a[i]表示第i行首地址;
a[i][j]的地址可以表示为    &a[i][j]                    a[i]+j       *(a+i)+j     a[0]+i*m+j

二维数组的指针变量的表达形式:
1.指向数组元素的指针变量:p为指向数组元素的指针变量,该变量存储的是列地址;p+1所指的元素是p指向的元素的下一个元素,*(a+i*4+j)即为元素a[i][j]。
int a[3][4];
int *p;
*p=a[0];

2.指向一维数组的指针变量(行指针):类型  (*指针变量名)[常量表达式]
类型:是指针所指数组的数据类型;*表示其后的变量是指针类型,两边的括号不可少,少了就表示成指针数组了;
常量表达式:表示二维分解为一维时,一维数组的长度,也就是二维的列数。
int a[3][4];
int (*p) [4];
p=a;
对二维数组元素的引用需采用两个下标的形式:*(*(p+i)+j)。


产生随机数调用的函数srand,rand,包含ctime,cstdlib两头文件:
int a;
srand(time(NULL));  //返回从午夜开始到当前的格林尼洛时间所经过的秒数;作用实现随机化
a=rand()%MAX;      //MAX是你想得到的随机数的最大值,rand返回从0到RAND_MX之间的伪随机数。


指向字符串的指针

字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向这个字符串。


指针数组和指向指针的指针

指针数组:数组元素都是指针类型的数组称为指针数组。
定义:类型 * 数组名 [常量表达式]
引入指针数组的主要目的便于统一管理同类的指针,能方便处理总多的字符串。
指针数组在函数中的运用:
char *nameptr [10];
S1(nameptr);

其中,S1的声明可为S1(char * nptr[])或者S2(char ** nptr)


指向指针的指针

指针的指针(多级指针):指针变量中保存的是另一个指针变量的地址。他是一个指针链。
定义:类型 **指针。
示意:一级      指针(地址)-->变量(变量值);
  二级       指针(地址)-->指针(地址)-->变量(变量值)。
注:()代表内容。

4.指针与函数

指向函数的指针

函数的入口码有一个入口地址,该地址对应的是函数的指针。函数的指针能赋给一个指向特定函数类的指针变量,并通过指向函数的指针变量调用他所指向的函数。

定义:返回值类型 (*指针变量名)(形参列表)。
*指针变量名外的括号是必须的,再与之后形参外的括号结合,表示指针变量指向函数。

调用函数方法:(*函数指针变量名)(实参表)

指向函数的指针并不固定指向某一个函数,只表示他是这样一个可以存放函数地址的变量。实际可根据需要,想指针变量赋不同的函数入口地址,使其指向不同的函数。


返回指针值的函数

函数可以返回某种指针类型的指针值,即地址。
定义:类型 *函数名(形参列表){函数体}


形参为数组的函数(详情可见点击打开链接
为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
实际传递的数组大小与函数形参指定的数组大小没有关系。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值