C语言笔记指针补充(原创,勿转)

指针

通过慕课网的学习,我了解到了指针的本质就是内存地址,它输出的是地址,得到的结果是地址里面保存的数据,就像一个标签一样,告诉你在哪里放了啥,而指针就是这个哪里。


通常*要与&一起用,因为 * 代表指针,是地址,所以后面传参时应该传来的是一个地址而非数值,所以要加&。


指针的运用,如果指针不加 * 代表访问地址,如果加 * 代表访问地址里的数据。


函数的指针写成例如:int (*xxx)(int a) = &xxx。


指针偏移:指针++表示往后面地址加4,即跳到下一个内存地址,此时输出 * 指针则得到下一个指针地址内的数据。(指针+=3或指针[3]意为往下移动三个内存地址)


数组是指针常量,不改变地址,而平时定义的指针是变量,通过偏移等方式获取不同内存地址。可以向字符串数组内scanf字符串数组,不可以向指针内scanf字符串数组


用for循环逐个输出printf("%c",str[i]);遇见"\0"会跳过然后继续,而字符串数组会直接停止。


同时也更多地了解到了计算机基础的知识,32位64位内存的不同,栈、代码段等等。0x7fffffffffff前的是留给系统内核的。指针在32位里占4个字节,而在64位中占8个。栈内存的分配,最先分配栈的地址大一些。


了解了gcc和gdb的使用,gdb是一个非常好用的调试工具,可以一步步看代码是怎样执行的。还可以看看变量的地址,通过地址来判断全局与局部变量

指针Plus

慕课网的课好像只带我了解了什么是指针,但是不太清楚它到底优势在哪,或者实际应用中怎么合理的运用指针,所以去b站上找找资源。

这b站的课讲了很多内存以及数据类型的知识,拓展知识面


数据类型本质的作用:合理利用空间


指针基本步骤:取变量地址--定义一个指针变量--地址与指针建立关系


指针的两种类型:自身的类型:去掉变量以后剩下的

指向的类型:去掉变量和最近一个*后剩下的,可用于推断p+1时增加了多少


指针读取数据是倒着读,同时也了解了怎样通过指针指向的类型来提取数据,若跨度与宽度不同,则可以通过强制类型转换来控制宽度或跨度

指针Plus——Plus

好像还是没有很懂,再看看课本。

看到例题示范的时候我回头看了看自己的代码,觉得可能作业一的错误有*使用的错误问题,经过自己尝试之后,显然并没有什么用(蠢),但是意外发现了个没了解过的报错

[Error] invalid type argument of unary '*' (have 'char')

大致意思就是对于*这个访问指针运算符无效?

查了一下看到了别人写的代码,也算有收获吧

int main (int argc, const char * argv[]) { int a4={}; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { ai=rand()%5; printf("a%d=%d ",i,j,ai);

} printf("\n"); } int * p=a; printf("%d\n",(p+1)); }

大家都评论说应该是int (*p)[4]=a;还有p不能用 * ( * p+1);这样的式子


了解到了&和*的结合性是自右向左的,也就是 *&a其实是 *(&a)


指针变量一定要赋值,这个很简单,但是刚开始接触指针的时候很容易定义出一个没有赋值的指针,要警觉一点,记住给指针变量初始化


指针的算术运算:通常只限于+、++、- 、--,表示指针的移动,运算结果仍为指针


指针的输出用%lu、%x(十六进制)、%o(八进制)


\t是补全当前字符串长度到8的整数倍,最少1个,最多8个空格


二级指针:

必须有两个*,指向类型为去掉变量名和最近一个 *后剩下的类型

定义时赋初值为:&一级指针名


指针与数组

定义指针变量:*p = &arr[i],二维类似;或 int *p; p=&arr[i];

指针类型要与数组类型相同


数组元素的指针变量的运算:

p++表示p指向当前元素的下一个元素

*p++由于 *和++的运算优先级相同,且结合方向为自右向左,因此等同于 *(p++),但是,与i++相同,运算顺序为,先 *p,再++

*(++P)先++,再 *p

(*p)++是p指向的元素值++


一维数组和二维数组在内存中都是按行连续存放的,所以用指针获得数组首元素后,可以用++或--访问数组中的任何一个元素


%3d是自动把数据补到3和3的倍数,例如"c"就会补为"c "


//剩下的书看不完了,自己回去后再看,之后会把这里补齐的


指针Plus——Plus——Plus

找学长学姐问东西

1.作业可以用strcat函数轻松搞定,找到空格之后,只要strcat (空格处,%20)就可以把%20插进去了

2.scanf里面套正则表达式

scanf("%\n",arr);

这里意为一直录入到\n为止,注意:\n会一直存在缓冲区里,需要getchar去清理一下缓存区,不然会出bug

3.malloc申请指定大小的空间

calloc申请指定大小的空间,并初始化

realloc重新申请,可大可小

这仨函数用于给指针内存,防止指针没有内存的情况

注意的是realloc要记得加一个

if (a==NULL) { printf("Null");

}

防止realloc找不到可用内存而返回空

4.重新编码和编码的区别。编码只是刷新文件,而重新编码是刷新文件、链接和库等,完全刷新,因此遇到清理缓冲区此类操作时,要进行重新编码,而非f9了事

5.%s和%c的区别。%s不会读取回车键,而%c不一样。由于%c读取的是单字符,所以即使是回车键,它也能识别并录入,所以如果scanf连用时存在%c,一定要清理缓冲区,否则无法运行。

你可能感兴趣的:(c语言,开发语言)