strcpy的模拟实现
//dest指向目标空间
//src指向源字符串
void my_strcpy(char* dest, const char* src)
{
int i = 0;
while (src[i] != '\0')
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}
void my_strcpy1(char* dest, const char* src)
{
while (*src != '\0')
{
//虽然++的优先级高于*,但后置++,先使用后++
*dest++ = *src++;
//src把\0之前的字符都拷贝给dest
}
//把\0单独拷贝
*dest = *src;
}
最巧妙的方法
char* my_strcpy3(char* dest, const char* src)
{
assert(src != NULL && dest != NULL);//断言,防止野指针
char* ret=dest;//用来返回被修改字符串的起始地址
//1.拷贝字符 2.遇到\0循环停止
while (*dest++ = *src++)
//*dest++ = *src++表达式的结果
//就是拷贝过去字符的结果,把'a'拷贝完,结果就是字符a,a的ASCII的值不为0,循环继续
//把\0拷贝完,\0的ASCII值是0,循环停止
{
;//空语句
}
return ret;
}
注意:strcpy
的使用
1.源头字符串中必须包含\0
2.目标空间要足够大
3.目标空间必须可修改,比如常量字符串,常量字符串放在常量区,是不能被修改的
注意:char* str=''abcde'';
的意思是把常量字符串首字符a的地址存放在str中
const注意事项
被const修饰的变量叫做常变量,它是不能直接被修改的
但有个方法就能让它跳过语法检查,从而被修改,那就是指针
int main()
{
const int num = 10;//num是常变量
//num=10 //erro
int* p = #
*p = 20;
printf("%d\n", num);
}
const
修饰指针
-
const
放在*的 左边,限制的是*p
(也就是指针指向的内容,下面指针指向的内容是num),没有限制p
-
const放在*的右边,限制的
p
,并没有限制*p
-
*的左右两边都有const
总结:
const放在*的左边,修饰的是指针指向的内容(p),指针指向的内容,不能通过指针来改变(
*p
=什么,错),但是指针变量本身是可以改变的
const放在的右边,修饰的是指针变量本身,指针指向的内容可以修改,但是指针变量本身(p)不能被修改
模拟实现strlen
//size_t 就是unsigned int
size_t my_strlen(const char* str)
{
assert(str != NULL);
int i = 0;
while (*str)
{
i++;
str++;
}
return i;
}
库函数里的strlen()
的返回值是size_t
(无符号整型),因为它不可能算出负数
思考下面这个问题,屏幕上到底是打印呵呵还是哈哈?
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)
{
printf("haha\n");
}
else
{
printf("hehe\n");
}
return 0;
}
答:haha
所以无符号数-无符号数
还是正数
函数栈帧
函数栈帧
ebp,esp
这两个寄存器中存放的是地址,这两个地址用来维护函数栈帧的
因为每一个函数调用,都要在栈区创建空间
在vs2013中,main函数也是被其他函数调用的
数组指针
数组中奇数放前
//1, 2, 3, 4, 5, 6, 7, 8, 9
//奇数放前,偶数放后
void move(int* arr, int sz)
{
int left = 0, right = sz - 1;
while (left < right)
{
//往后找偶数
while (left < right && arr[left] % 2 == 1)//%2为1就是奇数,还要往后找
{
left++;
}
while (left < right && arr[right] % 2 == 0)//left<right是大前提
{
right--;
}
if (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(int);
move(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
return 0;
}