A byte of C After After

2013-03-17 10:17:00 +0000

目标

白话C,最短时间内写出简单C程序. 终极篇

关键字

  • 1.宏
  • 2.指针
  • 3.++函数

上期答案

#include <stdio.h>
int fib(int x){
	if(x <= 1)  //边界返回
		return 1;		
	else 
		return fib(x-1) + fib(x-2); //递归调用
}
int main(){
	int i;
	for(i = 0;i < 10;i++)
		printf("fib(%d) = %d\n", i, fib(i));
	return 0;	
}

考虑以下情形

编程时有重复出现的数值常量,分散与程序的各个角落,要对其值修改时,情形将困囧起来。 条件编译,按需求编译程序的不同部分,程序移植. 本质上说,宏是在预编译时的纯替换

#include <stdio.h>
#define MAX 20 //即增加可读性,又便于修改
int main(){
	int stu[MAX], i;
	for(i = 0;i < MAX;i++){
		printf("%d\t%d", i, stu[i]);		
	}
	return 0;
}

指针

C的魅力所在,也是C coder的噩梦。 指针也是C的类型,于是乎有指针常量 指针变量。我理解的指针类型是标识地址的一种类型,就像通过“经纪人”找“歌手”,我们通过“指针”来访问“变量”。指针本身的是地址,通过地址,我们可以访问其他变量、函数。

两个操作符 * &
  • 1.&是取地址操作符
  • 2.*是地址访问操作符
指针变量的声明、初始化、访问
#include <stdio.h>
int main(){
	int a = 0;
	int *pa; //声明指针变量pa
	pa = &a;	//为pa初始化为a的地址
	//此时pa存储a的地址,可以说pa指向a 
	printf("%d %d\n", a, *pa);
	printf("%d %d\n", &a, pa);
	return 0;
}
指针变量是变量也可以被指向
#include <stdio.h>
int main(){
	int a;
	int *pa = &a;
	int **ppa = &pa; //ppa是指向pa的指针
	printf("%d %d %d\n", a, *pa, **ppa);
	printf("%d %d %d\n", &a, pa, *ppa);
	printf("%d %d\n", &pa, pa);
	return 0;
}
常量指针与指针的运算
#include <stdio.h>
int main(){
	int a[] = {1, 2, 3, 4, 5, 6};	//a是数组名,数组名的值是数组在内存的首地址,所以数组名是指针;编译后数组在内存里的位置确定,a的值不会改变,所以*数组名是常量指针*
	int *p = a;
	printf("%d %d\n", a, *p);
	printf("%d %d\n", a[1], *(p+1));//a[i] <==> *(p+i)
	return 0;
}

指针相关运算

  • a.指针+/-整型
  • b.指针+/-指针
  • c.指针关系运算符
  • d.指针sizeof

指针算数运算的自调节机制: >a.指针在与整型运算前会进行调整,将指针指向类型的大小来与整型相乘,再加。结果为__指针类型__

#include <stdio.h>
int main(){
	int a[] = {1, 2, 3};
	int *pa = a;
	int *pb = pa + 1; 
	//int *pb = &a[1]; 与上条等效
	return 0;
}

b.指针与指针类型算术运算,只有二者指向相同数组,结果才是定义了的。结果为__整型__

#include <stdio.h>
int main(){
	int a[] = {1, 2, 3};
	int *pa = a;
	int *pb = &a[2]; 
	printf("pa - pb = %d", pa - pb);
	return 0;
}

c.指针与指针类型关系运算,只有二者指向相同数组,结果才是定义了的。结果为__真或假__

#include <stdio.h>
int main(){
	int a[] = {1, 2, 3};
	int *pa = a;
	int *pb = &a[2]; 
	printf("pa > pb = %d", pa > pb);
	return 0;
}

d.指针的sizeof运算:直接作用于指针变量,返回指针变量的大小(4或8);对于数组名,会返回该数组的大小

#include <stdio.h>
int main(){
	int a[] = {1, 2, 3};
	int *pa = a;
	int *pb = pa + 1; 
	printf("sizeof(a) = %d sizeof(pa) = %d", sizeof(a), sizeof(pa));
	return 0;
}

先告一段落,还待完善。若有问题,敬请指出。