第八天c语言自学笔记

指针只是指向了空间,指针指向的空间不合法,导致操作出现问题

指针只要定义,必须初始化

 

自定义数据类型地址访问

 

对于连续空间里,保存的都是字节,而且这些字节都代表一个符号,称为字符空间

字符空间:约定了一个特殊的结束标志,以值0作为结束标志

非字符空间:空间中所有数值都能够表示具体含义,没有结束标志,

常量空间:“abc\101”

变量空间:

 

“ ”:常量地址

 

char arr1[] = "123456\101"

C语言发现这句话是初始化语句,主动调用C的库函数strcpy来完成两个空间的拷贝

如果在裸机系统开发中,编译器没有标准C库支持,这句话会在链接出错(自行编写拷贝函数来解决)

strlen(arr1)=7

sizeof(arr1)/sizeof(arr1[0])=8

 

防止:内存泄漏、内存溢出、野指针、栈溢出

 

字符空间头文件:include<string.h>

strlen(a):以a为首地址,逐个统计里面的字符个数,直到遇到0值结束

strlen("")=0

sizeof("")=1

 

char arr2[] = {'a','b','c'},

strlen(arr2)=未知(遇到\0结束计数)

sizeof(arr2)/sizeof(arr2[0])=3

 

stecpy(a,b):以b为首地址,将b区域的每个字节拷贝到a空间里,直到b中出现了0,0值也拷贝到a里

 

debug:调试--设置断点--查看内存信息

 

C语言 把连续的空间 分离处一个特殊空间 -- 字符空间

1、字符空间 c 约定了特殊的结束标志

2、提供了一系列的c支持的接口来操作字符串

strlen

strcpy

%s:以后面的值为地址,从这个地址开始,逐个字节进行符号解析,ASCII,解析到0为止(注意空间范围)

3、字符空间处理方法:逐一思想

可以根据0标志决定是否结束遍历

 

编写strlen函数

int myStrlen(const char *str){

 int i = 0;

  

 while(str[i]){

  i++;

 } 

 

 printf("%d\n",i); 

 

 return i;

}

 

char *p;

char *s;

两个地址的运算:+/-常量

地址1-地址2 == (地址1的数值-地址2的数值)/该地址的每个元素的大小==这两个元素的个数

int myStrlen2(const char *str){

 const char *tmp = str;

  

 while(*tmp){

  tmp++;

 } 

 

 return ( tmp-str );

}

 

 

禁止使用函数:strcpy()、gets()

字符空间处理 不能依赖于系统默认的结束标志,出现内存溢出,再结合空间的个数来双重限制(使用strncpy)

 

 

strncpy()编写:需要考虑结束标志

 

char *p;

strncpy( buf , p , sizeof(buf)-1 );

buf[ sizeof(buf) - 1 ] = 0;

 

char *strncpy(char *dest, const char *src, size_t n){

 size_t i;

 

 for( i=0; i<n && src[i] != '\0'; i ++ ){

  dest[i] = src[i];

 }

 for( ; i<n; i++){

  dest[i] = '\0'

 }

 

 return dest; 

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值