* 各个类型的变量输出的方式:
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 }; //最后的分号不可省略