有些概念的、重要的东西时间过久了容易忘记,好记性不如烂笔头,记录下来以便查阅
-
<stdio.h> 标准输入输出库,是函数的申明,在编译链接的时候会去找到相关函数的实现(通常是在编译器的libs中。)
-
system("puase")(和getChar()一个效果);这句话其实是执行的系统命令,假如命令为:mspaint则打开的是画板(在windows中)
-
占位符:
int : %d
short: %d
long :%ld
float :%f
double :%lf
string :%s
十六进制:%x
八进制:%o -
scanf("");
-
define xxxx------>宏定义
void main() {
int i=0;
int* p = &i;
printf("%#x\n",p);
printf("%#x\n",&p);
printf("%d\n",*p);
}
代码解读:
1、int* p申明一个int类型的(指针也是需要有类型的)指针类型的变量p,&为取地址符,表示存放i变量值的内存地址,而p变量的值存放为这个地址,
输出为:
0x5fbff75c ——>p的值,也就是i的地址
0x5fbff750 ——> 对指针变量p取地址,存放变量p的地址
0 ——>对*p取值,因为是p是指针变量,所以取到的是以p的值的内存地址编号存放的值
- 形参和实参
void change(int p) {
p=100;
}
/**
* 相对于java中的值传递和应用传递
*/
void main() {
int i=90;
int* p = &i;
change(i);
printf("%d\n",i);
}
这样子的输出是:90。因为把实参的值赋值给形参p,由于p是另外开辟的空间,改变p的值对i毫无影响。
如果想要i的值也要改变,就需要用到指针变量
void change(int *p) {
*p=100;
}
/**
* 相对于java中的值传递和应用传递
*/
void main() {
int i=90;
int* p = &i;
change(p);
printf("%d\n",i);
}
- 指针的类型
指针也是有类型的
/**
* 指针的类型
*/
void main() {
int i=90;
int* p = &i;
double j = 89.2;
p = &j;
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(double));
printf("%lf\n",*p);
}
输出:
4
8
0.000000
当一个double类型变量的地址赋值给int类型的指针的时候,取值会不正确的。因为指针p是int类型,占4个字节,存放的是内存当中开始的地址,也就是开始的地址往后数四个字节。当double类型的数据赋值给int指针p的时候,double是八个字节,当取值的时候p是int类型的指针只会去四个字节的值,所以取到的值只是高四位的值。
所以:指针保存的是地址开始的位置。
- 指针的运算
/**
* 指针的运算
*/
void main() {
int ids[] = {1,3,4,5,6,7};
printf("%#x\n",ids);
printf("%#x\n",&ids[0]);
}
输出:
0x5fbff6e0
0x5fbff6e0
0x5fbff6e0
可以看到,数组变量名的值,就是数组第一个元素的地址,&ids也是,编译器做了处理。
所以可以将数组变量名的值赋值给一个指针变量(*p)
网友评论