最近做完了关于指针和数组的功课,总是感觉自己学得不够扎实,对于深层次的东西没有挖掘到,深怕自己理解过于浅薄而误导大家,被真正了解它的前辈耻笑。
一直在思考在学习C的进阶的时候,为何要从C数据的存储开始讲起,这几天三句话离不开内存,来回踌躇了许久,鹏哥推荐了《C的深度剖析》,读了几页指针和数组的章节,终于顿开茅塞!对C这门学问终于有了一点实质性的理解,也终于可以有一些拿得出手的东西了。
提刀而立,为之四顾,为之踌躇满志。
——————————————————————————————————
从我第一次听课开始,就听老师一直说:指针就是地址,它在32位机器上占四个字节,在64位机器上占8个字节。
指针首先是一种数据类型,指针中存储的任何数据都会被当做地址来处理。
例:
int a = 10;
int * p = &a;
“ * ”表示p是一种指针类型的数据,而p中存储的是a的地址,其中a的类型为整型。同时可以通过解引用操作符“*”来访问指针所指向的存储空间内的数据。
常见的指针类型有以下几种:
char * pc = NULL;
int * pi = NULL;
short * ps = NULL;
long * pl = NULL;
float * pf = NULL;
double * pd = NULL;
其中NULL为空指针(当赋给指针变量的值未知的时候,可以赋空指针)。
指针的大小统一为4个字节(32位机器,64位机器为8个字节),而""前面的"char,int "类型等等是指针指向的空间的数据类型,它对指针唯一的影响就是决定指针在解引用访问数据时每次访问的字节数。
例:
指针的运算分为指针±整数和指针-指针:指针±整数表示指针向前或向后走多少长度;指针-指针则多用于计算字符串或者数组的元素个数。
指针也是变量,它也有地址。而二级指针就是专门存放指针(一级指针)地址的指针。
首先声明!
数组和指针没有任何关系,指针存放的是某个内存的地址,它可以指向任何地方,但是并不是任何地方的数据都可以通过指针解引用来访问。
数组就是数组,内存为它开辟空间的大小只和它的元素类型以及元素个数有关系,定义数组时必须指定元素的类型和个数,数组可以存储除了函数以外的任何类型的数据。
以指针的形式访问和以下标的形式访问指针
char * p = “abcdef”;
假设要访问字符串中的字符c,既可以用指针(p+2)来访问,也可以用下标p[2]的方式来访问。
以指针的方式和以下标的方式访问数组
int arr[] ={1,2,3,4,5,6};
假设要访问元素4,既可以用指针的方式(arr+3)来访问,也可以用下标arr[3]来访问。
这同时也说明:p2这个操作在计算机内部会被解析为先取出p里储存的地址,再加上中括号内数值的偏移量,再解引用。也就是说下标访问和指针访问在本质上没有区别。但这是计算机在解析运算符的规律,数组和指针仍然是两个概念,不能混为一谈。
指针数组本质上是一个数组,而它的每个元素都是一个指针。
例: int * arr[6] ;
它表示该数组有6个元素,而每个元素都是一个整型指针。
数组指针
例:
char (s)[] = {“hello”,“world”,“happy”,“everyday”};
由于小括号的原因,s先和’'结合,所以他是指针。这个指针指向的对象是一个数组。
这些都是我对指针和数组的粗浅理解,但是总算有点可以值得分享的东西,于是就腆着脸献丑了。
另外在书上看到一句话:‘‘初学者总是看中于printf函数的输出,而忽略了调试的结果,总是认为输出结果正确,代码就是对的。我建议:不到非不得已,不要用printf函数。’’
而我也认为调试很重要,于是借此立一个flag:除非不得已,不用printf函数。
本文发布于:2024-01-29 01:34:30,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170646327611766.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |