《c语言编程之道》笔记

//输入数据时忘记添加&符号
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是一届的,直呼差距大。 唉。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值