1 break的范围
执行break后,跳出最近的一个for循环语句或者最近的while,谁离break近,就从那里跳出来。
2 malloc用法
创建一个数组,并分配空间。
int * a;
a = (int *)malloc(sizeof(int) * 2);
3 定义链表
node *head = NULL, *p, *tail = NULL;
p = (node *)malloc(sizeof(node));
if(head == NULL)
head = p;
else
tail -> next = p;
p -> num = n;
p -> next = NULL;
tail = p;
p、tail、head这些都是节点的名称,是一个指针变量,变量的内容是地址。
开始的疑惑:执行下面两行代码后,会不会产生什么混乱?
tail -> next = p;
tail = p;
以上两行代码都是指针变量,它们的内存空间大小都是相同的,是四个字节。
存放的内容就是地址。
malloc开辟的空间,可以存放一个结构体,而p只是指向这个空间 。
创建含有头节点的单链表如下所示:
struct ListNode* p_new = NULL;
struct ListNode* p_tail = NULL;
struct ListNode* p_head;
p_head = new struct ListNode;
p_head -> next = NULL;
p_head -> val = 0;
p_tail = p_head;
for(int i = 0; i < (count1 + count2); i++)
{
p_new = new struct ListNode;
p_new -> val = a[i];
p_new -> next = NULL;
p_tail -> next = p_new;
p_tail = p_new;
}
return p_head -> next;
4 结构体中 . 与 ->
p -> num相当于(*p).num
5 数组要有结束符
char *s2;//存放最长回文子串
s2 = (char *)malloc(sizeof(char) * (n2 + 1));
for(i = 0; i < n2; i++)
{
s2[i] = s[p1 + i];
}
s2[i] = ' ';//这个结束符至关重要
6 标志位要及时置位
while(count != 0)
{
for(m = i + 1, n = p[count] - 1; m <= n; m++, n-- )
{
if(s[m] != s[n])
{
flag = 1;
break;
}
}
if(flag == 0)
{
if(n2 < (p[count] - i + 1))
{
n2 = p[count] - i + 1;
p1 = i;
}
break;
}
count--;
flag = 0;//这个flag要及时置位,不然第一次flag= 1后,执行一次if语句,后面的再也不会再执行上面的if判断语句了
}
count = 0;
flag = 0;
}
7 找字符串中子串这一类题
注意子串只有1个字符的这种特殊情况;
注意字符串是否有空格;
注意是否为空字符串。
8 用变量定义数组大小
数组的大小不能是一个变量,但可以用malloc动态分配。
int a[n];//这样定义是错误的,其中n是一个变量
//正确做法如下
int *a;
a = (int *)malloc(sizeof(int) * n);
9 不同变量内存分配的字节数
编译环境:LeetCode
使用sizeof(类型)进行测试,测试结果如下表所示。
类型 | 所占字节数 |
char | 1 |
short | 2 |
int | 4 |
long | 8 |
long long | 8 |
float | 4 |
double | 8 |
10 位操作
期望:通过位操作,取负数的绝对值。
测试程序如下:
#include <stdio.h>
int main(void)
{
int a = -123;
int b;
b = a >> 2;
printf("a = 0x%x, %d
",a,a);
printf("b = 0x%x, %d
",b,b);
}
测试结果如下:
a = 0xffffff85, -123
b = 0xffffffe1, -31
Press any key to continue
预期:b的最高位为0
通过测试结果可以看出,对于负数移位,并不是预期想的那样,而是直接/4。
测试2:
#include <stdio.h>
int main(void)
{
unsigned int a = 1;
unsigned int b;
b = a << 31;
printf("a = 0x%x, %d
",a,a);
printf("b = 0x%x, %d
",b,b);
}
测试结果:
a = 0x1, 1
b = 0x80000000, -2147483648
Press any key to continue
感受:对于位操作,在嵌入式中用来操作寄存器比较方便,但在C语言编程中容易出现意想不到的后果。
11 不同变量能表示的范围
对于int型,内存给它分配4个字节的空间,也就是32位。
其中最高位表示符号:0为正;1为负。
正数如下:
0 |
负数如下:
1 |
用正数和负数都可以表示0,如下图所示:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
实际上把负数表示的0规定为int可表示的最小负数:-2^31
int可表示的最大正数为:2^31 - 1
12 正数与负数的最高位
对于有符号的数据类型:
最高位为0:正数;
最高位为1:负数。
13 if语句要注意的问题
期望:
x<0时flag = 1;
x>0时flag = 0;
编写程序如下:
if(x < 0)
{
flag = 1;
x = 0 - x;//这条语句又会满足下一条if条件语句
}
if(x > 0)
{
flag = 0;
}
最终无论x大于0还是x小于0,flag永远为0,要避免这种错误。
14 数学函数的总结
比如要求2^5,可用pow()函数:pow(2,5)。
15 typedef与#define
定义一个无符号短整型变量如下:
unsigned short int a = 0;
发现变量名特别长,当多个地方要定义这种类型的变量时,显得特别麻烦。
于是可以用简洁的标识符代替繁长的变量类型,有如下两种方法:
宏定义法:
#define u16 unsigned short int
typedef 关键字:
typedef unsigned short int u16
16 bool数
数据类型符号:bool
取值:true或者false
17 数组首地址不能被赋值
int a[2] = {2,4};
int b[2] = {3,5};
a = b;//不能这样赋值
18 switch语句
default关键字前没有case
switch(s[i+1]) { case 'I': temp2 = 1;break; case 'V': temp2 = 5;break; case 'X': temp2 = 10;break; case 'L': temp2 = 50;break; case 'C': temp2 = 100;break; case 'D': temp2 = 500;break; case 'M': temp2 = 1000;break; case default: temp2 = 0;break;//default前不要case }
19 一条语句判断两个数的大小
return a > b ? a : b
20 for语句
两个判断条件要使用&&。