* 各个类型的变量输出的方式:

double float 用 %f ,char 用 %c(打印字符) 和 %d(打印编码),int 用 %d,字符串用 %s,指针用 %p 打印

* 定义变量不初始化,直接使用,并不会报错,结果输出这个变量是随机的。

* 定义数组不初始化,分两种情况,有加 {} ,输出的值初始化默认是 0 ,而不是随机的;没加 {} ,则是随机的:

a[3] = {1,2,3} //完全初始化

a[3] = {};        //不完全初始化

a[3] = {1};      //不完全初始化

a[3];              //无初始化

a[3] = {[0] = 1,[2] = 100};    //gcc 特有的初始化 ,指定位置数据

a[3] = {1,[2] = 100};    //gcc 特有的初始化 ,指定位置数据

这样定义数组,输出为:

0 0 0

1 0 0

随机 随机 随机 

1 0 100

1 0 100

============================================================================

指针:

(1)

int a = 11;   //定义 int 类型变量为 a

int *p ;    //定义一个“指针类型”变量为 p,指向 int 类型数据(指针本身是一种类型)【可以写成:int * p 、int* p 都可以】

p = &a;     // & 表示内存地址,这里表示把 a 的内存地址赋值给指针 p

*p = 22;    //给指针类型p 赋值为 22 

输出 a 等于:

22      //最终就相当于修改了a的内存地址的值为 22

(2)

int a[5] = {55,44,33,22,11};

int *p;

----

p = &a;  //编译警告,但执行结果正确,打印 55【数组类型不能直接赋值给int类型的指针】

p = &a[0];   //编译正常,执行正常,打印 55【这样表示“数据首元素”的首地址,意思和下面不同,但是值一样】

p = a;    //编译正常,执行正常,打印 55【对于数组来说,直接使用变量 a,表示的是“整个数组的首地址”,和上面意思不一样,但是打印值一样】

----

数组的两种表示方式,利用指针也可以来表示数组:

例如有:

int a[5] = {55,44,33,22,11};

int *p;

p = a;

依次输出:

第一种:a[0]  a[1]  a[2]  a[3]  a[4]

第二种:*p  *(p+1)  *(p+2)  *(p+3)  *(p+4)

void main() {
	printf("===========\n");
	int a[5] = {11,22,33,44,55};
	int *p;
	p = a;
	
	for(int i=0;i<5;i++){
		printf("*p = %d \n",*(p+i));
	}
	printf("===========");
}
打印出:
===========
*p = 11
*p = 22
*p = 33
*p = 44
*p = 55
===========

指针在子函数中的使用:

#include <stdio.h>

int exchange1(int a,int b);
int exchange2(int *a,int *b);

void main() {
	printf("===========\n");
	
	int x = 3,y = 5;
	printf("begin param x = %d,y=%d\n",x,y);
	
	//exchange1(x,y);
	exchange2(&x,&y);
	
	printf("begin param x = %d,y=%d\n",x,y);
	
	printf("===========");
}

int exchange1(int a,int b){
	int t;
	t = a;
	a = b;
	b = t;
	return 0;
}


int exchange2(int *a,int *b){
	int t;
	t = *a;
	*a = *b;
	*b = t;
	return 0;
}

//调用 exchange1 输出:
===========
begin param x = 3,y=5
begin param x = 3,y=5
===========
//调用 exchange2 输出:
===========
begin param x = 3,y=5
begin param x = 5,y=3
===========

结构体:(就类似 java 的对象)

#include <stdio.h>

//定义一个结构体,struct 是关键字
struct User{
	char name[20];	//姓名
	int num;		//编号
	int sex;		//性别
};


void main(void) {
	printf("===========\n");
	
	struct User s;
	s.name[0] = 'M';
	s.name[1] = 'o';
	s.name[2] = 'n';
	s.name[3] = 'g';
	s.name[4] = 'o';
	
	s.num = 38;
	s.sex = 1;
	
	//字符输出用 %s
	printf("name = %s,num = %d,sex = %d\n",s.name,s.num,s.sex);
	
	printf("===========");
	
}
输出:
===========
name = Mongo,num = 38,sex = 1
===========

结构体初始化两种方式:

方式一:struct User u = {x1,x2,x3,x4,x5};

方式二:struct User u = {

  .a = x1,  //用逗号隔开,a前面的点不可省略

  .b = x2,

  .c = x3,

  .d = x4,

  .e = x5

};  //最后的分号不可省略