1 基本的输入和输出printf()
printf("字符串");
printf("输出控制符",输出参数);
printf("输出控制符1 输出控制符2 。。。",输出参数1, 输出参数2,);其一一对应
printf("输出控制符 非输出控制符",输出参数);
输出控制符包括
%d int
%ld long int
%c char
%f float
%lf double
%x(#x)(#X) int (long int)(short int)
%o int (long int)(short int)
%s 字符串
如 :
int x1 = 47;
printf("%x\n",x1);//2f
printf("%X\n",x1);//2F
printf("%#x\n",x1);//0x2f
printf("%#X\n",x1);//0X2F
2 scanf("输入控制符",输入参数);
int x2 ;
scanf("%d",&x2);//& 取地址符 &x2 表示x2的地址
printf("x2 = %d\n",x2);
多变量赋值
scanf("%d %d",&i,&j);
多维数组:
是否存在多维数组:不存在
因为内存是线性一维的,在内存中是不分行不分列的。
N维数组可以当做每个元素是n-1维数组的 一维数组。
如果想把函数写在程序的后面,那么需要写函数声明:
如
void f(void);
int main(void)
{
f();
}
在一个函数内部,如果定义的局部函数的名字和全局变量名一样时,局部变量会屏蔽掉全局变量
进制互相转换 如
指针(☆☆☆☆☆)
内存的存储是以一个字节为一个编号,也就是8位合在一起给一个编号,不是0,1就给编号。
内存分为很多个单元,每个单元就会分配一个编号。
地址:内存单元的一个编号。而指针和地址一个概念的。也就是说指针就是地址
int *p;// p是变量名 int * 表示p变量存放的是int类型变量的地址
int i = 3 ;
p = &i;
//p = i;// error 类型不一致 p 只能存放int类型变量的地址 不能存放int类型变量的值
对 int * p的理解(☆☆☆☆☆) int * 类型 实质是存放int变量地址的类型
① p保存了 i的地址 p指向i
② p不是i,i也不是p 修改p的值不影响i 修改的i的值也不影响p
③ 如果一个指针变量指向了某个普通变量 则
* 指针变量 完全等同于 普通变量
*p代表的是p所指向的那个变量(表示以p的内容为地址的变量。)
上述例子中 p的内容是一个地址 *p其指向的变量当然就是i变量了
指针就是地址,地址就是指针 地址就是内存单元的编号
指针变量:存放地址的变量
而指针只是一个值,这个值是内存单元的一个编号。指针变量才是一个变量,他里面才可以存放数据。
指针不能进行算术运算-相加 乘 除。但是能相减。
如果两个指针变量指向的是同一块连续空间的不同存 储单元,则这两个指针变量才可以相减。
经典的值互换例子
#include<stdio.h>
void exchange1(int a,int b);
void exchange2(int *,int *);
void exchange3(int *,int *);
int main(void)
{
int a = 3;
int b = 5;
exchange3(&a,&b);
printf("a = %d, b = %d\n",a,b);
return 0;
}
void exchange1(int a,int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
void exchange2(int *p,int *q)
{
int *t;//如果要互换p q的值 则t 须是 int *(不能是int) 只是互换了地址
t = p;
p = q;
q = t;
}
void exchange3(int *p,int *q)
{
int t;//互换值 须定义为int
t = *p;
*p = *q;
*q = t;
}
如何通过被调函数修改主调函数普通变量的值(☆☆☆☆☆)见exchange3(&a,&b);
A) 实参必须为该普通变量的地址
B) 形参必须为指针变量
C) 在被调函数中通过 *形参名 = ...的方式来修改