&是取地址运算符
*是指针运算符(“间接运算”运算符)
一:将数值3送到变量中
1.直接送到变量x所标识的单元中
2.送到变量pointer所指向的单元(变量i的存储单元)
a.一个变量的地址称为该变量的“指针”
b.如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”
c.指针变量就是地址变量,用来存放地址的变量,指针变量的值是地址(即指针)
(1) 变量的指针 一个变量的地址就叫做变量的指针 (2) 指针变量 一种特殊类型的变量,是个变量,只不过这个变量存放的是指针(地址)
int *pointer;
float *x1,*x2;
char *c;
int,float,char是指针变量指定的“基类型”,其确定指针变量可指向的变量类型。
int i, j;
int *pointer_1, *pointer_2;
pointer_1 = &i;
pointer_2 = &j;
p = &a;
//使p指向a
*p = 1;
//*p相当于 a ,即a=1;
printf(“%d”,*p);
//将输出 1
printf(“%x”, p);
//将输出以十六进制输出a的地址
(1) 指针变量前面的“*”,仅仅表示该变量的类型为指针型变量,不是变量名的一部分。
(2)固定类型的指针变量只能存放相应的变量的地址。
(3)指针变量中只能存放地址(指针),不能将任何其他非地址类型的数据赋给指针变量。
已执行了语句 pointer_1=&a;
“&”和“*”两个运算符的优先级别相同,但按自右至左方向结合。
pointer_1与&a相同,即变量a的地址。
如果有pointer_2 =&* pointer_1 ;它的作用是将&a(a的地址)赋给pointer_2 ,如果pointer_2原来指向b,重新赋值后它不再指向b了,而指向a。
*&a等价于a
x相当于 a++
void swap(int *p1, int *p2)
{ int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
定义一个函数swap
将指向两个整型变量的指针变量作为实参传递给swap函数的形参指针变量,
在函数中通过指针实现交换两个变量的值。
void swap(int *p1,int *p2)
{ int *temp;
*temp=*p1;
*p1=*p2;
*p2=*temp;
}
分析:
函数中未定义temp,未给temp分配内存,未初始化。
所以只定义了一个 指针temp 但并未让他指向一个有效的内存单元
此时他的指向是随机的(未初始化的指针变量是不确定的)据说很危险
对应的主函数
int main(){
int num1 = 10,num2 = 20;
int *p1 = &num1,*p2 = &num2;
swap(*p1,*p2);
}