C语言错题整理5-2021-10.4

1-各种类型的长度和取值范围

在这里插入图片描述

2-一维/二维数组/数组指针


数组指针
1.&a[i][j]-------数组元素a[i][j]的地址
2.&a[i]---------数组元素a[i][0]的地址
3.a[0]+j--------数组元素a[0][j]的地址
4.*(*(a+i)+j)----数组元素a[i][j]的地址
5.*(a[i]+j) -----数组元素a[i][j]的地址
6. &a ----------数组的地址
7. a[0] --------数组首行首元素地址(二维数组中)
8. a -----------数组首行地址
数组名是常指针,不能改,例如:a++

3-strlen与sizeof

char *a="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};

char str1[8] = {'a', 's', 'd'};
char str2[20] =0123456789;
int  str3[20] =0123456789;
char str4[] = "as\0df";
string str5={‘a’,‘b’,‘c’,’\0,‘X’};

sizeof(a)=4;  strlen(a)=6;
sizeof(d)=7;  strlen(d)=6;
sizeof(e)=6;  strlen(e)=14;
sizeof(str1) = 8;   strlen(str1) = 3;
sizeof(str2) = 20;  strlen(str2) = 10;
sizeof(str3) = 80;  strlen(str3) = error;
sizeof(str4) = 6;  strlen(str4) = 2;
sizeof(str5) = 5;  strlen(str5) = 3;

当以字符串赋值时,“abcdef”,结尾自动加一个"/0".
strlen(a)遇到/0就会结束,求的是字符串的长度,为6,sizeof(a)求的是类型空间大小,在前面说过,指针型所点的空间大小是4个字节,系统地址总线长度为32位时。
strlen(d)也是一样,字符串赋值,自动添加/0,求字符串的长度当然是6,sizeof(d)是求这个数组所占空间的大小,即数组所占内存空间的字节数,应该为7.
sizeof(e), 数组e以单个元素赋值,没有/0结束符,所以所占空间的大小为6个字节,strlen(e),去找/0结尾的字符串的长度,由于找不到/0,所以返回的值是一个不确定的值。

str1是也是字符数组,但大小确定为 8,故 sizeof 得到的结果是 8;strlen 统计 \0 之前所有字符的个数,即为 3;
str2 中sizeof(test) 为20,test表示在内存中预分配的大小,20x1,strlen(test) 为 10,在遇到’\0’字符就结束循环;
str3 中sizeof(test) 为80,int 在内存中占4个字节,故分配的内存为 20x4,strlen(test) 报错,因为stelen 接受的参数只能为char ,且必须是以’\0’结尾,而此例子为int *;
str4 是常量字符数组,sizeof 得到字符总数即 6;strlen 计算至 \0 结束,因此返回 2;
总结一句就是 sizeof 计算的是变量的大小,而 strlen 计算的是字符串的长度,前者不受字符 \0 影响,后者以 \0 作为长度判定依据。

4-原码,反码,补码

正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1 ] = [10000001]原 = [11111110]反

正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1 ] = [10000001]原 = [11111110]反 = [11111111]补

5-位运算与逻辑运算

在这里插入图片描述

6-break与continue

int array[10] = {5,3,2,6,4,7,9,8,0,1};
int i;
for (i = 0; i < 10; i++)
{
    if (array[i] == 7)
    {
        printf("%d\n", i);
        break;
    }
}

在循环体中通过if语句找到数组中值为7的下标并显示其值,当然后通过break语句跳出循环,也就是说当程序执行break语句时将结束整个循环,而本应该继续循环的内容将不会被执行。上面程序中执行6次循环,i的值为5,然后剩下的内容不执行,直接结束。

int array[10] = {5,3,2,6,4,7,9,8,0,1};
int i;
for (i = 0; i < 10; i++)
{
    if (array[i] < 5)
    {
        continue;
    }
    printf("%d\n", i);
}

但是在if中我们判断如果数组中变量的值小于5时则执行continue语句,于是结束本次循环,进入下一次循环,所以只有当大于等于5时都会执行printf语句,所以结果为:
0 3 5 6 7

break:跳出循环语句,执行后面的代码
continue:终止本次循环,进行下一次循环。

7-strcpy/strcat/strcmp

#include <stdio.h>
#include <string.h>

int main()
{
	char str[32] = "helloworld";
	char ptr[32] = "12345";

	strcpy(str, ptr);   //把数组ptr的数据拷贝到数组str里面 包括'\0'
	printf("%s\n", str);

	strncpy(str, ptr, 3);
	printf("%s\n", str);

	strncpy(str + 1, ptr + 3, 2);
	printf("%s\n", str);

	strcat(str, ptr);    //把ptr数组里面的数据连接到str后面
	printf("%s\n", str);

	strncat(str, ptr + 1, 3);
	printf("%s\n", str);

	if (strcmp(str, ptr) > 0)      //字符串比较
	{
		printf("%s > %s\n", str, ptr);
	}
	else
	{
		printf("%s < %s\n", str, ptr);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值