错题总结五
一.?操作访问字节个数问题
这道题考察的是指针有关的知识,而这种指针的知识我们提到过
在这里,我们复习一下。在指针里,int有4个字节,short有2个字节,换句话说,什么类型的指针决定了一次可以处理几个字节。
对上面的题画图说明
int? ? ? ? ? ? ? ?4个字节? ? ? ?
? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ?2? ? ? ? ? ? ? ? ? ? ? ? ?3? ? ? ? ? ? ? ? ? ? ? ? ? ? 4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
01 | 00 | 00 | 00 | 10 | 00 | 00 | 00 | 11 | 00 | 00 | 00 | 00 | 01 | 00 | 00 | 01 | 01 | 00 | 00 |
低地址? ? ?0? ? ? ? ? ? ? ? ? ? ? ?1? ? ? ? ? ? ? ? ? ? ? ? 2? ? ? ? ? ? ? ? ? ? ? ? ? 3? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4? ? ? ? ? ?高地址
short? ? ? ? +1是加2个字节? ? ? ? ?
因此,for循环中i每+1都在int中前进2个字节,并且使得那2个字节变成0.一共走8个字节,也就是说,for循环中走过了前2个int,都变成0,其余不变。所以最后的结果是00345? ? ? ?
二.指针的基本知识
1.int指针+1,向后偏移4个字节
? ?short指针+1,向后偏移2个字节
? ?double指针+1,向后偏移8个字节
? ?char指针+1,向后偏移1个字节? ? ?
指针-指针得到是指针和指针之间的元素个数? ? ?
? ? ?指针能比较大小 ? ? ?
三.const位置对指针的限制
int *const p? ? ? p的内容不能改变
int const *p? ? ? p的指向不能改变
const int *p? ? ??p的指向不能改变
int *p[10]? ? ? ? ?数组,长度是10,数组里面的内容是int*? ? ?存放指针的数组--指针数组
int (*p)[10]? ? ? ?指针,指向一个数组,数组长度是10,是int类型的数据--数组指针
依据我自己的理解,就是看const距离最近的是上什么,*ps就是指向,p就是内容,而且最后一个是p跟什么,是什么就在后面,例如,int *p[10] 是数组,因此是指针数组,int (*p)[10] 是指针,因此是数组指针
四.指针的加减运算
6 | 7 | 8 | 9 | 10 |
将指针指向开头,也就是6,然后指针移动3指向9,最后在指向的数字+3,就是将9处改为12。所以最后的输出结果是6 12
五.
在小端中的存储
44 | 33 | 22 | 11 |
而题目中将首变成0,即
00 | 33 | 22 | 11 |
从高到低输出是11223300
什么是大小端(针对的是字节序)
低位字节? ? ? 高位字节
? ? ? ? ?0x11223344
小端
低地址? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 高地址
44 | 33 | 22 | 11 |
大端
11 | 22 | 33 | 44 |
六.野指针
没有初始化的指针
如何避免野指针
使用空指针(NULL)初始化指针变量
在指针释放后将其设置为NULL
确保指针始终指向有效的内存地址
检查指针的有效性后再进行访问
七.逆置
#include <stdio.h>
void Charge(char *str)
{
char *left = str;
char *right = str + strlen(str) -1;
while(left < right)
{
char tep = *left;
*left = *right;
*right = tep;
left ++;
right --;
}
}
int main() {
char str[10000] = {0};
while (gets(str) != NULL) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
Charge(str);
printf("%s\n",str);
}
return 0;
}
八.实现一个函数,可以左旋字符串中的k个字符。
//例如:
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
A B C D
? ?B C D A?
? ? ? ?C D A B
? ? ? ? ? ?D A B C
? ? ? ? ? ? ? ?A B C D
1.确定挪动几个(有4个字符,就是n%4)
2.怎么挪动(后一个覆盖前一个)
void leftRound(char* str, int time)
//{
// int len = strlen(str);
// time = time % len;
// int i = 0;
// for (; i < time; i++)
// {
// char tep = str[0];
// int j = 0;
// for (j = 0; j < len - 1; j++)
// {
// str[j] = str[j + 1];
// }
// str[j] = tep;
// }
//}
//
// int main();
// {
// char str = "ABCD";
// leftRound(str, 2);
// printf("%s\n", str);
// return 0;
// }
#if 0
#endif
在代码前后,隐蔽代码
#if 1
#endif
消除代码的隐蔽 ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!