地址和指针★★★★★★★
(Adress) (Pointer)
内存(Memory):临时性存储正在运行的程序数据
硬盘(HardDisk):永久性的存储所有的数据
难点:准确判断出指针到底指向谁:判断一个指针指向谁,只需判断该指针中保存的是谁的地址
#include<stdio.h>
int main()
{
int x = 3;
int* p;
p = &x; //将x的地址取出,并赋给p
printf("%d %d\n", p, &x);
return 0;
}
注意:& 只能对变量取地址,不能对常量和表达式取地址
★★★
若在程序中定义了一个变量,C编程系统就会根据定义中的变量的类型,为其分配一定字节数目的空间(在VC6.0 中 short int 型数据占2字节,int 型数据和 float 型数据占4字节,double 型数据占8字节,char 型数据占1字节,指针变量占4字节)
* 在C语言中的含义
1、乘号 1*2
2、定义指针变量:int* p(当 * 作为第二种含义时,* 只能与前面的数据类型看成一个整体,不能与后面的指针变量看作一个整体)
3、间接访问(引用)运算符:*p = 4(当 * 作为第三种含义时,* 必须与后面的指针变量看作一个整体)
语法:* 后面只能出现指针,或地址,不能出现普通的常量或变量
功能:是在引用 * 后面的指针(地址),所指向的存储单元中的值
性质:当 p 指针指向某个变量 x 时,*p 与 x 完全等价:
1、*p 的值与类型跟 x 的值与类型完全相同
2、改变了 x 的值,*p 的值也会随之而改变,反之依然
注意:若对指针的概念不清,以致滥用,将大大降低程序的可读性,如果对指针使用不当,将指针指向意料不到的地方,致使程序失控,严重的将导致系统崩溃。
#include<stdio.h>
int main()
{
int x = 3;
int * p;
p = &x; //p指向了x *p <=> x
x++; //x:4
(*p)++; //*p++ <=> *(p++)
printf("%d %d\n", *p, x);
return 0;
}
#include<stdio.h>
void swap(int* a, int* b) //参数传递:a = &x, b = &y a指向了x, b指向了y
{ //*a <=> x, *b <=> y
int t;
t = *a; //<=> t = x
*a = *b; //<=> x = y
*b = t; //<=> y = t
}
int main()
{
int x = 1, y = 2;
swap(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
利用指针进行参数传递实现函数中同时返回多个值的功能,即指针可传递多个值
#include<stdio.h>
void cirle(double r, double * s, double * c) //参数传递:r = 10, s = &mj, c=&zc
{ //s指向了mj, c指向了zc *s <=> mj, *c <=> zc
*s = 3.14*r*r;
*c = 2*3.14*r;
}
int main()
{
double mj, zc;
cirle(10, &mj, &zc);
printf("%g %g\n", mj, zc);
return 0;
}
准确判断常量、变量、表达式类型 :
1、= 左边只能变量 ,不能出现常量和表达式
2、= 左右两边的类型必须匹配
这里:**q <=> *(*q) <=> *p <=> x
#include<stdio.h>
int main()
{
int x = 3, *p = &x;
int** q; //定义int型指针的指针
q = &p; //q指向了p
return 0;
}
#include<stdio.h>
int main()
{
int x = 3, *p = &x;
int** q;
q = &p;
printf("%d %d %d %d %d\n", q, &q, p, *p, **q); // 04 06 02 3 3
return 0;
}
示例:下列给定程序中,函数 fun 的功能是:计算如下:
例如:若形参e的值为1e-3 则函数返回值为0.551690
#include<stdio.h>
int main()
{
double s=0, fz=3, dishu=2, n=1;
while(fz/(dishu*dishu)>1e-3)
{
s=s+fz/(dishu*dishu)*n; //计算s
fz=fz+2; //计算下一项的分子
dishu=dishu+2; //计算下一项分母的底数
n=-n;
}
printf("%f\n", s);
return 0;
}
★★★★★★★
1、普通的变量(常量):4种类型之间均能互相匹配
int、double、float、char 例如 int
2、普通的指针(地址):4种类型之间均不能能互相匹配
int*、double*、float*、char *
3、指针的指针:4种类型之间均不能能互相匹配
int**、double**、float**、char **
4、特殊的指针(地址)