指针与指针变量

(1).指针的含义:

通过地址能找到所需的单元变量,地址形象化的称为指针。

指针式通过地址来体现的,地址指向所需的单元变量,即通过指针能够找到以它为地址的内存单位

存储单位的地址   存储单位的内容

对变量的访问都是通过地址进行的

访问方式:

1.直接访问:按照变量名进行访问。

2.间接访问:将一个变量的存放在另一个变量中,然后通过该变量来找到之前变量的地址,进而访问之前的变量。

 

2).指针变量(地址变量):                            

一个变量专门存放另一个变量的地址(即指针)。指针变量的值是地址(即指针)

指针变量是基本数据类型派生出来的类型,不能脱离基本类型而独立存在。

例:

#include<stdio.h>
int main()
{
	int a=100,b=10;     //定义整型变量a,b,并初始化
	int *pointer_1,*pointer_2;    //定义指向整型数据的指针变量pointer_1,pointer_2,‘*’表示指向
	pointer_1=&a;                //把变量a的地址赋给指针变量pointer_1
	pointer_2=&b;                //把变量b的地址赋给指针变量pointer_2
	printf("a=%d,b=%d\n",a,b);   //输出变量a,b的值
	printf("*pointer_1=%d;*pointer_2=%d\n",*pointer_1,*pointer_2);  
                                 //通过指针变量输出整形变量的值
	return 0;
}

定义指针变量时左侧应有类型名,否则就不再是定义指针变量。

        类型名 *指针变量名;

如int *pointer_1;    //必须制定指针变量的基本类型

(“&” 取地址符 获得变量所占存储单元的地址                       “ * ” 指针运算符 =间接访问运算符,获得指针所指向的内容)

 

(3).定义指针变量注意点:

1.“ * ” 表示该变量是指针

2.定义指针变量是必须制定基本类型,因为不同类型的数据在内存中所占的字节数和存放方式是不同的。C的地址信息包括存储单元的位置(内存编号)和类型信息,指针变量的属性应与之相匹配。如果赋值时,赋值号的两侧类型应该一致,避免出现意外结果。

3. 指针变量只能存放地址(即指针),不能将整数直接赋值给指针变量。

4.使用指针变量作为参数时可以得到多个变化了的值。

 

(4).引用指针变量

1.给指针变量赋值:    p=&a;    //把a的值赋给指针变量p。

2.引用指针变量指向的变量:   

3.引用指针变量的值:  

比较输入的两个数的大小,并按大小顺序输出
例:(1)

#include<stdio.h>
int main()
{
    int *p1,*p2,p,a,b;                   //p1,p2是*int类型
    printf("输入两个整数:");
    scanf("%d,%d",&a,&b);
    p1=&a;                             //使p1指向变量a
    p2=&b;                             //使p2指向变量b
                             //此时,a,b的值只是赋给了p1,p2,因此p1,p2的值的改变并不影响a,b的值
    if(a<b)                  
    {
       p=p1;                           
       p1=p2;
       p2=p;
    }                                 //p1和p2的值互换,即可输入成p1=&b,p2=&a
    printf("a=%d,b=%d\n",a,b);             //a,b的值并没有交换
    printf("max=%d,min=%d\n",*p1,*p2);   //输出p1,p2所指向的变量的值
    return 0;
}

(2)

#include<stdio.h>
int main()
{
	void swap(int *p1,int *p2);             //p1,p2是形参变量
	int a,b;
	int *pointer_1,*pointer_2;               //定义实参变量,定义int*型的指针变量
	printf("输入两个整数:");
    scanf("%d,%d",&a,&b);
	pointer_1=&a;                    
    pointer_2=&b;
	if(a<b)                
		swap(pointer_1,pointer_2);  //调用swap函数时,将实参变量的值传送给形参变量,采用“值传递”
	printf("max=%d,min=%d\n",a,b);   //p1=pointer_1=a,p2=pointer_2=b
	return 0;
}

void swap(int *p1,int *p2)
{
	int temp;
  	temp=*p1;
	*p1=*p2;
	*p2=temp;                       //使*p1,*p2互换
}

错误示例

#include<stdio.h>
int main()
{
	void swap(int *p1,int *p2);
	int a,b;
	int *pointer_1,*pointer_2;
	printf("输入两个整数:");
	scanf("%d,%d",&a,&b);
	pointer_1=&a;
	pointer_2=&b;
	if(a<b)
		swap(pointer_1,pointer_2);
	printf("max=%d,min=%d\n",*pointer_1,*pointer_2);
	return 0;
}

void swap(int *p1,int *p2)
{
	int *p;
	p=p1;              
	p1=p2;
	p2=p;
}

 C语言中实参变量和形参变量之间的数据传递是单向的”值传递“方式,因此不能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针变量所指的值。

 例:输入三个整并且由大到小排序

#include<stdio.h>
int main()
{
	void exchange(int *q1,int *q2,int *q3);
	int a,b,c,*p1,*p2,*p3;
	printf("输入三个整数:");
	scanf("%d,%d,%d",&a,&b,&c);
	p1=&a;
	p2=&b;
	p3=&c;
	exchange(p1,p2,p3);
	printf("The order is:%d,%d,%d\n",a,b,c);
	return 0;
}

void exchange(int *q1,int *q2,int *q3)
{
	void swap(int *pt1,int *pt2);
	if(*q1<*q2)
		swap(q1,q2);
	if(*q1<*q3)
		swap(q1,q3);
	if(*q2<*q3)
		swap(q2,q3);
}

void swap(int *pt1,int *pt2)
{
	int temp;
	temp=*pt1;
	*pt1=*pt2;
	*pt2=temp;
}

使用嵌套,多次执行swap函数,进行两个变量的比较,进而进行三个值得比较。

 

“ &* ”和“ *& ”的区别

“ & ”和“ * ”的运算符优先级别相同,按照从右至左的方式结合。

int a;
p=&a;

//" &*p "相当于取变量a的地址
//" *&p "相当于取变量a所在地址的值,即变量a

指针的自增自减运算

#include<stdio.h>
int main()
{
	int i;
	int *p;
	printf("输入一个数:\n");
	scanf("%d",&i);
	p=&i;                            //将变量i的地址赋给指针变量
	printf("输出p的地址:%d\n",p);
	p++;                             //地址加1,这里的1并不代表一个字节
	printf("输出p++后的地址:%d\n",p);
	getchar();
	getchar();
	return 0;
}

基本整型变量i在内存中占四个字节,指针p是指向变量i的地址的,此时的p++不是在地址上加1,而是指向下一个存放基本整型数的地址。意味着一次增加四个字节

    原文作者:孔 某 人
    原文地址: https://blog.csdn.net/qq_44911784/article/details/89855802
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞