• 注册
当前位置:1313e > 默认分类 >正文

19-11-10-C 基础语言四

上一节,我主要介绍了标准库的使用,这节我主要是对数组指针进行做出一些总结发表一些看法;

一:数组

​ 数组是由类型名,标识符和维数组组成的符合数据类型,类型名还规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数;

数组的定义和初始化:
/*这是个一维数组*/
int a[2]   //[]中的数必须用大于等于1的常量表示,如果没有将会变成一个无效的数组;
a = {65,64}
/*这是个二维数组*/
int b[3][4] //同样,在二维数组中两个[][]也必须是const;
b = {{5,8,4,2},{8,9,4,5},{8,4,5,45}};    

注意在初始化过程分为显示赋值和隐式赋值,这两种赋值的不同点同上,没有赋初始值的是隐性赋值,表示只是在内存中通过初始的类型开辟相应大小的内存,而显示赋值除了将开辟一块相应的内存区域,还将花括号的值放入到相应的内存中;

注意:数组的赋值不支持将一个数组赋值给另一个数组;

数组的操作:

​ 与vector一样数组的操作是通过下标来表示的,访问数组是从0开始计数,在用下标访问元素时,vector使用vector::siize_type作为下标的类型,而数组下标的正确类型是size_t;

注意:在使用数组时最常见的是数组下标越界的;所以在使用的时候要注意数组下标的问题;

二:指针:

​ 指针是指向某种类型对象的复合数据类型,是用于数组的迭代器:指向数组的一个元素,在指向数组的元素上使用解引用操作符 * 和自增加操作符++ 与在迭代器上的用法类似;对指针进行解引用的操作,可获得该指针的所指对象的值,而指针做自增操作时,则移动指针指向数组的下一个元素;

char a = 'Hello World';
char *b = &a;       //定义了一个指向char类型的指针b,并初始化b使其指向char类型的对象 a;
/*符号解释:*b 指针类型,表示指向值所在内存的第一个空间下标 ,&a(取地址操作符) 取到的是a的地址,*/
指针定义和初始化:

需要分清什么是指针类型什么是指针所指向的类型:

char *p;			//指针的类型是char*    指针所指向的型行是char
char **p;			//指针类型是char**	  指针所指向的类型是char*
char (*p)[3];		//指针类型是char(*)[3]	指针所指向的类型是int()[3]
char *(*ptr)[4];	//指针类型是char *(*)[4] 指针所指向的类型是char *()[4]	

​ 指针可能的取值:

​ 一个有效的指针必定有三种状态;保存一个特定对象的地址:指向某个对象后面的另一个对象:或者是0值,若指针保存0值,表明它不指向任何对象,未初始化的指针是无效的,直到给该指针赋值后,才可以使用它,同时避免使用没有初始化的指针

指针使用:

指针和引用的比较:虽然指针都是指向另一个值,但是,引用不会修改被引用的内容,而修改指针就相当于修改了被指向的内容;

​ 多级指针:

​ 在c中有多级指针的概念就是在指针的基础上,在定义一个指针,指向另一个指针的地址,这样二级指针所对应的值就是一级指针所指向的值(注意,这里二级指针不是直接指向值的而是通过一级指针指向值的);

const和指针:
const double p = 3.14;
double *pi = &p;			//错误
const double *pi = &p;		//正确,因为定义的const类型的指针必须是const类型的地址才可以;
指针和typedef:
typedef string *pstring;
const pstring cstr;

上面定义的typedef很容易让人搞错,因为typedef不是普通的文本扩展,很多人以为上面的内容是:

const string * cstr; 其实不是,*正确的因该是: string const cstr;

三:总结:

​ 以上就是我对数组指针的理解;下面会对表达式和异常进行总结学习,如果您发现有什么不对的地方欢迎给我批评指正,谢谢~

e-mail:jsntwangchenchen@outlook.com 王晨晨

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录