错题总结五

发布时间:2024年01月01日

一.?操作访问字节个数问题

这道题考察的是指针有关的知识,而这种指针的知识我们提到过

指针相关知识(入门)-CSDN博客

指针相关知识(进阶)-CSDN博客

在这里,我们复习一下。在指针里,int有4个字节,short有2个字节,换句话说,什么类型的指针决定了一次可以处理几个字节。

对上面的题画图说明

int? ? ? ? ? ? ? ?4个字节? ? ? ?

? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ?2? ? ? ? ? ? ? ? ? ? ? ? ?3? ? ? ? ? ? ? ? ? ? ? ? ? ? 4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

01000000

10

000000110000000001000001010000

低地址? ? ?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] 是指针,因此是数组指针

四.指针的加减运算

678910

将指针指向开头,也就是6,然后指针移动3指向9,最后在指向的数字+3,就是将9处改为12。所以最后的输出结果是6 12

五.

在小端中的存储

44332211

而题目中将首变成0,即

00332211

从高到低输出是11223300

什么是大小端(针对的是字节序)

低位字节? ? ? 高位字节

? ? ? ? ?0x11223344

小端

低地址? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 高地址

44332211

大端

11223344

六.野指针

没有初始化的指针

如何避免野指针

使用空指针(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

消除代码的隐蔽 ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

文章来源:https://blog.csdn.net/2301_80190473/article/details/135314982
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。