文章目录
1.正整数和负整数取非运算都是0。
2.对于指针的运用
int a[]={1,7,12,15};
int *p1 = a, *p2 =p1++;
*p1 += *p2++;
printf("%d %d",*p1, *p2);
//8 8
p1 = a;//正确书写方式 表示将p1指针指向a数组的首地址
p2 = p1++;//表示p2指针指向p1自加后的位置,即a数组的第二个位置
// * 和 ++ 的优先级相同
//但是由于是后++ 所以 *p1 = 1+7 = 8 此时 *p2 = 7+1 = 8
*p–的含义是什么?e.g:
int a[]={1,2,3,4};
int *p = a+2;
//此时p指向a数组中的3
prinf("%d",*p--);
//此时输出3
//但是p指向的是a数组中的2。
#include <stdio.h>
int func(int *q){
return (*q--=3)-1;
}
int main()
{
int a[]={10,7,5};
int *p=a+1;
printf("%d",func(p)+*p); //2+3 = 5
return 0;
}
//为什么输出的是5?
//不是移动了p的指向了吗?
原因是:移动的是形式参数q的指针,而不是实际参数p的指针,对main函数中的p指针没有影响!!
总之会改变指针指向的地址的元素数值,即*q--=3导致了q指向的7变化为3并改变q的指针指向数组a的第一个元素。但是并没有改变p指针指向,即p指针仍指向a数组的第二个元素,但此时a数组的第二个元素已变化,所以是2+3=5
3.switch中的奇怪应用
int i =1 ;
switch(i){
printf("Hello"); //warning: statement will never be executed 警告:该语句永远不会被执行
case 1: printf("Hi ");
case 2:printf("Bye");
}
//所以会输出 Hi Bye
4.两个文件指针指向同一个文件
同时指向文件头,但是执行顺序不同会导致最终文件内容不同
FILE *p1, *p2;
p1 = fopen("test.txt","w");
p2 = fopen("test.txt","w");
fputc('A',p1);
fputc('B',p2);
fclose(p1);
fclose(p2);
//最终文件test.txt中的内容是B
//因为B会覆盖掉第一次写入的A
//指针头不会同步变化~
5.ASCII码基础
char c=48; 立即推输出printf(“%c”,c);时,会输出的是0,
空格→ASCII→32
'a’→ASCII→97
'A’→ASCII→65
'0’→ASCII→48
补充:或运算是将字符或八进制或16进制转换成二进制然后逐位相与。
八进制的表示方法如: int hhh = 01;
十六进制的表示方法如:int bbb = 0x1;
int hhh = 011;
int bbb = 0x11;
printf("%d %d",hhh,bbb); //9 17
6.运算符优先级
转自:http://blog.csdn.net/huangblog/article/details/8271791
优先级高的先执行,否则就是看运算符规则
! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
记住优先级为1的运算符就好。要先执行就要加括号
如 *p.num 即结构体引用,这种引用是错误的。应该是(*p).num才正确。
7.要利用函数改变一般参数的值,一定要将地址传递过去
//e.g:
//1.
swap(&a,&b); //交换a和b的值
//2.
int a[] = {1,2,3}
change(a); //通过change()函数改变a的值
//3.
int *p = a; //指向a数组
reverse(p,0,len(a)); //将p的地址传递过去 翻转数组
void reverse(int a[], int i, int n);
8.指针数组
char *point[]={"one","two","three","fourth","five"};
//point[0],point[1]...point[4]都是指向对应字符串首地址的指针
//所以可以进行运算
//如:
point[2]=point[3]; //赋值运算
point[2] += 2; //移动指针
//移动后 输出point[2]即为"urth"
9.笔试题目中直接声明 int len=5, dat[len]; 属于错误声明 会报错
10.注意函数代码写的是什么【在选择题求结果/找错题中出现】
void reverse(int a[], int n){
for(int i=0; i<n; i++){
int t = a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
}
}
//上面这个函数表面上是一个翻转函数,实际上将数组对换了两边,从而数组相当于没有变化
正确写法: 将 i<n 改为 i<n/2即可
11.字符串中strlen()是不计入最后的终止符的长度的
#include <stdio.h>
#include <string.h>
int main()
{
char a[]="\0";
printf("%d",strlen(a)); //输出 0
return 0;
}