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;
}