C语言——初识指针

什么是指针​​​​​​

指针的本质就是变量,可以是各种数据类型。它存的值为另一个变量地址。但指针也有属于它自己的地址。

指针变量的一般形式为:

指针的基本类型  *指针变量名称

注: * 是用来指定一个变量是指针。

以下都是有效的指针声明:

int *p;    //整型指针
float *p;  //单精度浮点型指针
double *p; //双精度浮点型指针
char *p;   //字符型指针

含义:定义一个 *p,其中 p 就需要一个地址(可用 & 符号获取其变量的地址再赋值给 p ),而*p,是一个具体的值,及取地址后获得的值。

例如:

#include
#include
int main()
{
	int a=5;
	int *p;
	p=&a;
	printf("%d   %d\n",*p,a);
	printf("%x   %x\n",p,&a);
	printf("%x\n",&p);
	system("pause");
	return 0;
}

输出结果为:

C语言——初识指针_第1张图片

 

     a     (变量名)      

      5 ( ) 
24fd60 (地址)

      

          
 

     p    (变量名)        

24fd60   (值)
24fd54  (地址)

     

     

 

现在 p 就存的是 a 的地址,*p 取地址,就取的是 p 所存地址的值(a)5。&p为 p 自身的地址,因为 p 本身也是一个变量,所以他自身也有地址;


 


指针的作用

我们了解了指针的概念和本质后,我们要了解,学习指针到底有什么用。

在讲它之前呢,先讲一下我们在学习函数时讲过一个东西--值传递

#include
#include
void swap1(int a,int b)
{
	int c;
	c=a;
	a=b;
	b=c;
}
int main()
{
	int a=10,b=100;
	swap1(a,b);
	printf("%d   %d\n",a,b);
	system("pause");
	return 0;
}

运行结果为:

C语言——初识指针_第2张图片

指针在C语言中的重要用途 :指针允许你以更简洁的方式引用大量数据结构

指针可以使程序的不同部分能够共享数据,如下:

用指针来进行操作:

指针的经典例题:

#include
#include
void swap2(int *a,int *b)
{
	int c;
	c=*a;
	*a=*b;
	*b=c;
}
int main()
{
	int a=10,b=100;
	swap2(&a,&b);
	printf("%d %d\n",a,b);
	system("pause");
	return 0;
}

输出结果为: 

C语言——初识指针_第3张图片

 

在这里就体现了指针的作用,它是对数据的地址直接进行操作的。在main函数第三行中,将 a 和 b 的地址传给了子函数,直接在子函数中运用指针将 a 和 b 的值进行了交换。


指针与数组的关系

由于编译器为每个变量都分配了一个地址,如果编译器需要一个地址来执行某种操作时,就可以直接进行操作。并不需要增加指令首先取得具体的地址。如下:

int a[10];

数组的数组名就是数组的首地址。 

在上面的代码中, a 就代表整个数组的首地址,编译器会给数组 a 分配一个空间,但不会为 a 本身分配空间。

#include 
#include 
int main()
{
	int a[10];
	printf("%x\n",a);
	printf("%x\n",&a[0]);
	system ("pause");
    return 0;
} 

输出如下:

C语言——初识指针_第4张图片

 

 

 

数组指针(行指针)

含义:是指针----指向数组的指针。

其一般形式为:

int (*p)[10];

其中 括号 ()  的优先级最高,故 p 先与 * 结合,首先说明 p 是一个指针,指向一个整型的一维数组。数组的长度为10,要执行p+1时,p要跨过10个整型数据的长度。

如下图所示:

  

                                                                      int (*p1)[10]  (p1为指针变量名)

int 

int  int  int  int  int  int  int  int  int 

          p1 是一个指针,它指向一个包含10个int类型数据的数组,即数组指针。                                  

如果将二维数组赋给一指针,如下:

int a[3][4];
int (*p)[4];//指向含四个元素的一维数组
p=a;//将二维数组的首地址赋给p
p++;//该语句执行后跨过行a[0][]指向a[1][]

所以说数组指针也称为一维数组的指针,亦称行指针。

指针数组

含义:是数组----装着指针的数组。

一般形势为:

int *p[10];

其中 [] 的优先级高,先于 p 结合成为一个数组,再由 int* 说明这是一个整型指针数组,它有 10 个指针类型的数组元素。也就是说现在 p 就代表的不是一个指针了,而 p[0],p[1],p[2]...p[9] 是指针,它现在赋值就应该为:

int a[3];
int *p[3];
*p=a;

此时 *p 就等于p[0],即 *(p+n) == p[n]。而赋值就变成了 *(p+1)=(a+1);将数组 a 中的第 n 个元素赋值给指针数组 p 。因为这里 int *p[3],表示一个数组内 存放着 三个指针变量,分别是   p[0],p[1],p[2]   所以要分别复制。

如下图所示:

                                                                                        int *p2[10]

int * int * int * int * int * int * int * int * int * int *

 

数组指针 只是一个指针变量,是C语言里专门用来指向二维数组的,它占有一个指针的存储空间。

指针数组 多个指针变量以数组的形式存储在内存中,占有多个指针的内存空间。

比如要表示数组中 i 行 j 列的一个元素: *(p[i]+j)、*(*(p+i)+j)、(*(p+j))[j]、p[i][j]

优先级: () > [] > * 

你可能感兴趣的:(C语言指针,菜鸟)