题目
这道题到底会打印什么。
char**pa=a;等于a的首元素地址,也就是
*pa=work,然后pa后置++,越过了一串字符,所以打印at
代码运行一下看看我对不对
第二道题
这道题就比之前的难道难的多了
根据画图可以得到这样的对应信息
第一次打印
***cpp=cp,cp的首元素地址是c+3,然后第一题打印是**++cpp,前置++,所以打印c+2位置的字符串,c+2字符串对应的是PONINT。
第二次打印
由于第一次打印++cpp,cpp的位置是在c+2的位置,在++ 就变成了c+1的位置在--,c+1位置变成c在+3打印ER
第三次打印
*cpp[-2] +3可以转换成 **(cpp-2)+3,由于第二次打印把cpp的位置改成c,然后-2那么他就是c+3的位置在解引用+3就打印ST
第四次打印
这次打印和之前打印不同没有++ --运算符,所以cpp的位置没变,还是在c的位置上
cpp[-1][-1]可以分解为 (*(cpp-1)-1) +1,cpp-1变成了c+2的位置然后在-1变成了c+1的位置c+1的位置是指向NEW的,解引用再+1,打印出来EW
运行一下代码确认下答案
第三道题
ptr1等于整个数组+1,然后-1,所以打印10
ptr2等于首元素+1,首元素加1是6的位置,再减1等于5的位置,所以打印5
运行一下
函数实现部分
strlen
strlen这个函数的作用是用来计算字符串有多少元素的
代码
#include<stdio.h>
#include<assert.h>
int my_strlen(const char*str)
{
assert(str);
int count = 0;
while (*str++)
{
count++;
}
return count;
}
int main()
{
int len = my_strlen("abcdefg");
printf("%d\n", len);
return 0;
}
strcopy
strcopy复制字符串
#include<stdio.h>
#include<assert.h>
char* my_strcopy(char* left, const char* right)
{
assert(right && left);
char* tmp = left;
while (*left++ = *right++)
{
;
}
return tmp;
}
int main()
{
char arr1[] = "abcdefg";
char arr2[100] = { 0 };
my_strcopy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
strcat
strcat这个函数的作用是追加字串串
代码
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* tmp = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return tmp;
}
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}