中国大学慕课C语言第八讲笔记

指针

&是什么

这里写图片描述

这里写图片描述

是变量能取地址,不是变量不能取。

这里写图片描述

变量的地址:可以;
相邻变量的地址:可以,并且相差为4;

这里写图片描述
这里写图片描述

先定义的变量在内存更高的地方。
自顶向下分配,紧挨着,相差等于4。

这里写图片描述

这里写图片描述

相邻地址差距永远是4。

scanf怎么做事情

这里写图片描述

需要的这个能保留地址的变量,就是指针。

指针

这里写图片描述

第三四行是一个意思,就是p是指针,指向了int,q是一个普通类型的变量。*号是加给p的,*p是一个int,于是p是一个指针。

这里写图片描述

i是变量,p是指针,i放在0x2000的地方,那么p就等于2000,就说p指向了i。p里的值就是i的地址。

指针变量

这里写图片描述

作为参数的指针

这里写图片描述

例子

这里写图片描述

解释:

这里写图片描述

i变量里的值是6,位置是70,把位置交给一个函数,p就是70,p指向i。

这里写图片描述

如果只是把i的值传给函数里的k,那么函数里的k和外面的i没有关系。但是如果把i的地址传到函数里,那么函数就有权限访问外面的i。

访问地址上的变量

这里写图片描述

试一下:

这里写图片描述

*p是可以得到i的值的。

这里写图片描述

改变*p的值,原来i的值也要被改变。

scanf如果里面没有用&符号,那么编译不一定出错,但是运行会出错,因为会拿你给的值作为地址来运行。

作为参数表中的数组变量是什么?

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

如果把p当做数组看能不能输出P[0],是可以的。

这里写图片描述

p[0]是指把p所指的地方当做数组,所以可以看做int min[1],长度是1,有效下标是0。

这里写图片描述

数组是常量指针

这里写图片描述

b是一个常数,不能被改变,代表一个数组,不能代表另一个数组。所以数组不能做赋值。

这里写图片描述

字符串

这里写图片描述

只是字符数组,不是字符串。

应该这么做:

这里写图片描述

最后那个0使得现在的word是字符串了。前面是字符数组,但是最后有一个0变成了字符串。

字符串概念

这里写图片描述

0,是int是四个字节;
‘\0’是一个字节;
‘0’是ASCII码可以读到的。大小事0x30,16进制:30,十进制的48。

字符串的表达

这里写图片描述

第一个:有一个指针,名字叫做str,它指向了一个字符数组,里面内容是Hello;
第二个:有一个字符数组,里面的内容是Hello;
第三个:有个字符数组叫做line,数组的大小是10个字节,往里面放了Hello。Hello占据了6个字节的位置,因为还有0。

这里写图片描述

第二周的代码,如果两个字符串挨着,C语言会把两个合并成一个大的字符串。

这里写图片描述

如果写成第一个字符串\第二个字符串,那么因为自动对齐的问题,这两个字符串的输出结果之间会有两个tab,所以要取消空格,比较麻烦。
所以一般都用两组双引号括着两个字符。

总结

这里写图片描述

字符串变量

这里写图片描述

本地变量i,s,s2可能在相邻位置,i就为0,s和s2指向同一个字符串,里面是字符数组,这个位置很小,很小的位置位于程序的代码段,试图写入,因为计算机有保护机制,会让程序崩溃。放在只能读不能写的地方。

这里写图片描述

指向那个字符串
字符串就在这里,所以可以修改。

这里写图片描述

就在本地,可以修改。

指针还是字符串

这里写图片描述

char*是字符串吗?

不一定。

这里写图片描述

字符串赋值

这里写图片描述

这里写图片描述

字符串的输入输出

这里写图片描述

这里写图片描述

因为最多能读8个字符,多了会越界。
所以%7s让程序最多读7个字符,防止越界崩溃。
如果超过7个:

这里写图片描述

前面给了第一个scanf,后面给了第二个scanf。

安全的输入

不再依据空格了,只能读到7个。

这里写图片描述

常见错误

这里写图片描述

只定义了指针没初始化。有时候没问题,有时候指到有害的地方就有问题了。

空字符串

这里写图片描述

如果让编译器替我们建立一个字符串,决定字符串的长度,那么这个字符串的长度只有1,buffer[0]是0,但是放不下任何字符串,所以不能这么定义。

字符串函数

常用字符串函数

这里写图片描述

strlen

这里写图片描述

str是所有的开头,len是lenth,这个函数告诉那个字符串的长度是多少。作为参数,数组的形式和指针是一样的,所以这里就用指针表达了
希望函数不修改传进去的数组用const。

这里写图片描述

strcmp

这里写图片描述

compare比较两个字符串,可以比较出谁大谁小,做比较不要修改字符串所以用const。

这里写图片描述

0表明两个字符串相等。

这里写图片描述
不能这样比较,数组的比较永远是false,因为这两个数组永远不可能是相同的地址,如果用==比较,意思是相同的地址。

这里写图片描述

b比a要靠后,所以要大。

这里写图片描述

小写字母比大写字母要靠后,所以要大。

这里写图片描述

就说明给出的就是a-A的差值。

这里写图片描述

多一个空格,多了32。

这里写图片描述

这是上面的原理:
多一个空格,相当于0-空格的大小,就是-32。

strcpy

这里写图片描述
这里写图片描述

strcat

就是连接两个字符串。

这里写图片描述

原理:

这里写图片描述

src是world\0,
dst是Hello\0,还有一些空间。
然后就是把w连接到dst的\0那里,然后之后的字母依次在后面,最后加上\0。

安全问题

需要拷贝或者链接的地方没有足够的空间
不是从dst[0]开始拷贝,而是从dst[strlen(dst)]等于scr的0。
不知道空间多少,是盲目的往里面填东西,越界了也不知道,所以尽可能不要使用这两个函数。

安全版本

这里写图片描述

对于cpy来说n就是最多可以拷贝多少个字符,对cat就是最多可以连上多少个字符,多了掐掉;
对于cpm,n的作用不是安全,而是想比较开头前n个字母。

这里写图片描述

字符串中找字符

strchr在这个字符串寻找c第一次出现的位置,从左边开始,返回的是指针;
strrchr是从右边找过来,返回NULL表示没有找到,返回非NULL表示找到了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值