* 和 &的使用(指针初步)

&是取地址运算符

*是指针运算符(“间接运算”运算符)

指针基本概念

一:将数值3送到变量中

1.直接送到变量x所标识的单元中

2.送到变量pointer所指向的单元(变量i的存储单元)

a.一个变量的地址称为该变量的“指针”

b.如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”

c.指针变量就是地址变量,用来存放地址的变量,指针变量的值是地址(即指针)

变量的指针和指针的变量

(1) 变量的指针      一个变量的地址就叫做变量的指针 (2) 指针变量     一种特殊类型的变量,是个变量,只不过这个变量存放的是指针(地址)

指针变量的定义和赋值

1.定义
int *pointer;
float *x1,*x2;
char *c;

int,float,char是指针变量指定的“基类型”,其确定指针变量可指向的变量类型。

2.赋值
int  i, j;
int  *pointer_1, *pointer_2;
pointer_1 = &i;
pointer_2 = &j;
3.指针变量的最基本使用
 p = &a;
//使p指向a
*p = 1;
//*p相当于 a ,即a=1;
printf(“%d”,*p);
//将输出 1
printf(“%x”, p);
//将输出以十六进制输出a的地址
 
4.注意

  (1) 指针变量前面的“*”,仅仅表示该变量的类型为指针型变量,不是变量名的一部分。

(2)固定类型的指针变量只能存放相应的变量的地址。

(3)指针变量中只能存放地址(指针),不能将任何其他非地址类型的数据赋给指针变量。

&* 和*&

已执行了语句   pointer_1=&a;

“&”和“*”两个运算符的优先级别相同,但按自右至左方向结合。

(1)&*

pointer_1与&a相同,即变量a的地址。

如果有pointer_2 =&* pointer_1 ;它的作用是将&a(a的地址)赋给pointer_2 ,如果pointer_2原来指向b,重新赋值后它不再指向b了,而指向a。

(2)*&

*&a等价于a

(3)(*pointer_1)++

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);
}

你可能感兴趣的:(数据结构)