上篇的延续
assert
#include <stdio.h>
#include <string.h>
#include <assert.h>
void my_strcpy(char* dest, char* src)
{
assert(src!=NULL);//断言 满足某个条件 不允许发生什么事情的时候用断言
assert(dest!=NULL);
while (*dest++ = *src++)//非0为真 0为假 传到\0 他的ascll码值为0所以为假
{
;
}
}
int main()
{
char arr1[20] = "xxxxxxxxx";
char arr2[] = "hello";
//strcpy(arr1, arr2);//拷贝包含\0
my_strcpy(arr1, arr2);
printf("%s", arr1);//打印结果为hello因为字符串结束标志为\0
return 0;
}
const
**如果将while (*dest++ = *src++)
写成while (src++ = dest++)程序运行结果报错 因为arr1的内容太多
拷贝反了 那我们怎么发现这样的错误 如下加一个const
const另外用法
const就是让那个值不可被修改,任何修改的都会报错
int main()
{
/* int num = 20;
int* p = #
*p = 20;
printf("%d", num);*///输出结果为20
//int const num = 20;
//num = 20;//err
//int* p = #
//*p = 20;
//printf("%d", num);//输出结果还是为20 但是加一个num=20会报错
int num = 20;
const int* p = #
*p = 20;
printf("%d", num);//这样就可以了
return 0;
}
const修饰指针
int num = 20;
const int* p = #
*p = 20;如果放在*左边 修饰*p 表示指针只想内容,是不能通过指针来改变的
printf("%d", num);//这样就可以了
return 0;
如果放在左边 修饰p 表示指针只想内容,是不能通过指针来改变的,但是指针变量本身可以修改 如下p
const放在*的右边如下 正好调换
**如果放在*右边 修饰p 表示指针变量不能被改变,但是指针指向内容可以改变 **
**如果int const * const p=&m 两个都不行了,
*p=0//err
p=&n//err **
**strcpy这个库函数 其实返回的是目标空间的起始地址 所以msdn里返回值是char
**
其实这样写不行 因为跟上面while冲突 怎么写如下
因为函数有返回值 char* 所以可以把返回值放到参数部分1 链式访问如下