//输入数据时忘记添加&符号
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d,%d\n",a,b);
}
//奇葩的死循环
unsigned int i;
for(i=10;i>=0;i--)
{
printf("%d",i);
}
//忽略了字符串的结束符
int main()
{
char* or_str="I am a super man";
//char* cp_str=(char*)malloc(strlen(or_str));
char* cp_str=(char*)malloc(strlen(or_str)+1);
strcpy(cp_str,or_str);
printf("%s\n",cp_str);
free(cp_str);
}
//数组长度使用变量
int main()
{
int i,max;
//int ts=5;
const int ts=5;//vs2013下可以
int temp[ts]={20,12,30,45,34};
for(i=0;i<5;i++)
{
printf("%d\n",temp[i]);
}
}
//include
#include "stdio.h"
系统会先在自己编写的文件中进行查找,如果找不到,就到库文件中查找。
#include <stdio.h>
当调用某个函数时,系统会直接在库文件中进行查找。
//& | ~与&& || !
按位运算& | ~的操作数被默认为是一个二进制的位序列,分别对每个位进行操作
逻辑运算符 && ||~ 将操作数当成非真即假 非假即真
//*p++ 是自增p还是p指向的变量
后缀++和--操作符的优先级高于前缀的一目运算符。因此*p++ 和*(p++)是等价的,
自增p并返回p自增之前所指向的值。
int main()
{
char* p="mingri";
printf("%c\n",*p++);
printf("%c\n",*p)
return 0;
}
输出:
"m
i"
//const和#define 不一样
const定义的常量是有数据类型的
而 #define定义的宏常量没有数据类型
编译器可以对前者进行类型安全检查 而后者没有,有可能产生一些以外的错误
//宏定义中的常见谬误
宏扩展必须使用括号,以保护表达式中低优先级的操作符
#define ADD(n) n+n
5*ADD(n)
会被扩展为 5*n+n
//浮点变量与零值的比较
在使用浮点变量的时候,不能将浮点变量用== !=与任何数字比较。因为其有精度限制。
应使用>= <=
if(x>=0.xxx) if(x<=0.xxx)
//gets函数的使用
不要轻易使用这个函数。不能通过它安全地保存字符串中的大量字符。如果使用它来读取
的大量字符,内存会被破坏。可以使用fgets()来代替它。与gets()不同,fgets()不会抛
弃来自输入的终结符\n
使用scanf有同样的危险。使用%20s格式使它读取的字符不会超过20个
//限定词const
const int NUM=12;
该变量被定义为只读变量,在程序中不能被改变。
定义const变量时,必须对该变量初始化。
用const限定的对象的值并不是一个真正的常量,不能用作数组维度?/貌似可以
//使用static关键字声明静态变量
函数中局部变量所占用的存储空间不被释放
#include <stdio.h>
test()
{
auto int a=0;
static b=3;
a++;
b++;
printf("%d\n",a);
printf("%d\n",b);
}
main()
{
int i;
for(i=0;i<3;i++)
{
test();
}
}
b=6
//限定词volatile
限定词volatile修饰的变量是随时可能变化的。
volatile int num=5
volatile常用在多线程环境下,因为在编写多线程程序时,
同一个变量可能会被多个线程修改,通过定义volatile变量,
程序在读取该变量前会同步各个线程,以取得该变量的最新
修改值。
//c语言如何解释a<b<c
int main()
{
int a=1,b=2,c=2;
while(a<b<c)
{
int t;
t=a;
a=b;
b=t;
c--;
}
printf("%d\n",c);
return 0;
}
//typedef
使用typedef声明数组类型、字符串类型比较方便
//int a[10],b[10],c[10],d[10],e[10];
typedef int arr[10];
arr a,b,c,d,e;
使用typedef关键字声明的数据类型有利于程序的移植
//静态全局变量与全局变量
全局变量之前再加上static就变成了静态全局变量。全局变量也是通常
所说的外部变量,其本身就是静态存储方式,两者在存储方式上并无不
同。 两者区别在于作用域的不同。非静态全局变量作用域是整个源程序,
而静态全局变量则限制了其作用域,只在定义该变量的源文件中有效。
//什么是空指针
空指针不会指向任何地方,它不是任何变量或函数的地址。取址操作符&
永远不会返回空指针。
空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何地方,
而未初始化的指针可能指向任何地方。
//&a+1
#include <stdio.h>
void main()
{
int a[5]={11,22,33,44,55};
int* ptr=(int*)(&a+1);
printf("%d %d",*(a+1),*(ptr-1));
}
运行结果: 22 55
&a+1 不是首地址加1,系统会认为加一个a数组的偏移,是偏移了一个数组大小
//malloc 与calloc
void* malloc(size_t size);
在内存中动态分配一块size大小的内存空间
注:使用malloc函数分配的内存空间实是在堆中,而不是在栈中,所以使用完这块内存
之后一定要将其释放掉。 free~
void* calloc(size_t n ,size_t size);
int pArray;
pArray=(int*)calloc(3,sizeof(int));
区别:
malloc分配一块size大小的内存块,calloc分配一块n*size大小的内存块
malloc分配的内存块没有被清零
calloc分配的内存块清零
//野指针:
指针变量没有被初始化
指针被释放或者删除后,没有设置为NULL,被误认为是合法的指针
指针的操作超出了变量的作用范围,这种情况不易被发现
//使用宏时
书写宏定义的时候,如果需要续行,有些编译器需要加续行符 /
在宏定义时,宏名和带参数的括号间不要加空格,否则该空格将被看做是
宏体的一部分
//enum的好处
enum weekday
{
sun,mon,tue,wed,thu,fri,sat
};
不需要对常量进行逐个赋值
使程序调试起来方便,某些标识符调试程序能打印枚举常量的值
//使用指针实现字符串的连接
#include "stdafx.h"
#include <stdlib.h>
void connect(char* s, char* t, char* q);
void connect(char* s, char* t, char* q)
{
int i = 0;
while (*s != '\0')
{
*q = *s;
q++;
s++;
}
while (*t != '\0')
{
*q = *t;
q++;
t++;
}
*q = '\0';
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str, *t, *p;
str = "One World";
t = "One Dream";
p = (char*)malloc((_mbstrlen(str)+_mbstrlen(t)+1)*sizeof(char));
connect(str, t, p);
printf("%s\n", p);
return 0;
}
//使用指针实现字符串的插入
#include "stdafx.h"
#include <stdlib.h>
char* insert(char* s, char* q, int n)
{
int i ;
char *str;
str = (char*)malloc(30 * sizeof(char));
for (i = 0; *s != '\0'; i++)
{
if (i == n - 1)
{
while (*q != '\0')
{
str[i] = *q;
i++;
q++;
}
}
str[i] = *s;
s++;
}
str[i] = '\0';
return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* s, *q, *str;
s= "Hello World";
q= "Big ";
str=insert(s, q, 7);
printf("%s\n",str );
return 0;
}
//使用指针的指针输出字符串
#include "stdafx.h"
#include <stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
char* strings[] =
{ "C Languge",
"Basic",
"Java",
"Python",
"C#" };
char** p;
int i;
p = strings;
for (i = 0; i < 5; i++)
{
printf("%s\n", *(p + i));
}
return 0;
}
今天一大三学长发说说,感叹和ByVoid是一届的,直呼差距大。 唉。