一. 操作访问字节个数问题
这道题考察的是指针有关的知识,而这种指针的知识我们提到过
指针相关知识(入门)-CSDN博客
指针相关知识(进阶)-CSDN博客
在这里,我们复习一下。在指针里,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
消除代码的隐蔽