指针的基本概念及使用

指针

  1. 指针:通过地址能找到所需的变量单元,因此说,地址指向该变量单元,将地址形象化的称为指针;可理解为地址就是指针;
  2. 指针变量:存放指针(地址)的变量;
  3. 指针的作用:通过指针间接访问内存;
  4. 指针变量的定义:类型名 * 指针变量名 一个变量的指针的含义包含两个方面,一是存储单元的纯地址,二是指向存储单元的数据类型,故定义指针变量时要指定基类型,用来指定此指针变量可以指向的变量的类型; 注释:* 取内容运算符,间接访问运算符 ,*p代表指针变量p所指向的对象;& 取地址运算符,&a是变量a的地址;
int a = 10;//创建整型变量a,并给它赋值为10;
int *p = &a;//建立了指针p和变量a的关系,创建指针变量p,并将变量a的地址赋值给p,通常这样我们就称指针p指向了a;
*p = 20;//通过指针间接访问内存;解引用操作,通过*p间接修改变量a的值;
  1. 指针的大小:
void test()
{
          
   
	//指针在32位操作系统下,都是4个字节大小
	printf("sizeof char * = %d
",sizeof(char *));
	printf("sizeof int * = %d
",sizeof(int *));
	printf("sizeof double * = %d
",sizeof(double *));
	printf("sizeof short * = %d
",sizeof(short *));
}

 使用sizeof()测量指针的大小,得到的总是:4或8  sizeof()测的是指针变量指向存储地址的大小  在32位平台,所有的指针(地址)都是32位(4字节)  在64位平台,所有的指针(地址)都是64位(8字节)

    注意:使用指针的时候,当 * 和 & 同时出现时,从右往左依次抵消;如下:
如果有:int a = 0;int * p = &a; 那么:*(&a) == *p == a 理解:&a也就是p,*p 也就等价于a &(*p) == &a == p 理解:*p 等价于a,&a 也就是p

为什么使用指针

  1. 定向的将数据存储到指定内存单元(地址);
# include <stdio.h>
int main()
{
          
   
	int a;
	a = 10;
	int *p;
	p = &a;
	printf("a address is %p
",p);//这里得到的地址是0x0060ff00,不同编译器得到的地址不一样
	int *p2 = (int *)0x0060ff00;//将指针变量p2指向这块内存地址
	*p2 =20;
	printf("在内存的%p的位置,存放值是%d
",p2,*p2);
}//打印输出:在内存的0x0060ff00的位置,存放值是20
  1. 指定内存单元进行数据的操作;
#include <stdio.h>
void swap(int a, int b)
{
          
   
	int temp =a;
	a=b;
	b=temp;
}
int main(void)
{
          
   
	int a=5,b=10;
	swap(a,b);
	printf("a=%d   b=%d",a,b);
	return 0;
}
    在这一段代码运行下来发现,输出的结果a还是等于5,b还是等于10,他们的值并没有交换. 这是为什么呢? 从内存的方面分析,main函数的a,b存放在一个地址空间上,而函数中的a和b又是另外一个空间的a,b,并不是main函数中的a,b的地址,而是在栈上开辟的空间,只是把他们的值传递过来了,最后进行交换,函数调用结束后,栈的空间就被释放了,所以main函数中的a,b并没有发生变化。 那要交换他们的值就必须用到指针,把他们的地址传递进去就可以经行交换了。如下所示;
#include <stdio.h>
void swap(int *a,int *b)
{
          
   
	int temp=*a;
	*a=*b;
	*b=temp;
}
int main()
{
          
   
	int a=5,b=10;
	swap(&a,&b);
	printf("a=%d    b=%d
",a,b);
	return 0;
}
经验分享 程序员 微信小程序 职场和发展