最近几天在摸鱼,所以继续学点以前学过但早就忘光的东西:指针!
指针可谓是C语言的核心,它是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
下面先从基础开始吧!
1、定义指针变量(变量名前加*)
首先定义一个int型的cute变量并对其进行赋值:
int cute = 10;
然后定义另一个变量dhq_pointer,利用这个变量并在其前面加一个则可以间接访问一个变量的值:
int dhq_pointer;
这个(称之为星号)表明变量dhq_pointer是指向int类型的指针,也就是说dhq_pointer在程序中用于间接访问一个或多个int整数值。
2、地址运算符&
&是一个地址运算符,在C语言中用于使一个指针指向一个对象。因此,如果x是某种特定类型的一个变量,则表达式&x就是指向该变量的指针。所以,对于任何一个变量,如果已经将其声明为一个指针并指向与x相同的类型,就可以把&x赋值给该变量:
dhq_pointer = &cute;
这就在dhq_pointer和cute之间建立起了间接引用。地址运算符&的作用是将指向变量cute的指针赋给dhq_pointer变量。
3、间接运算符
如果要通过指针变量dhq_pointer来引用cute的内容,可以使用间接运算符,它是一个星号*。因此,如果x被定义为int类型,则语句x = *dhq_pointer可将dhq_pointer间接引用的值指定给变量x。
4、代码演示
#include<stdio.h>
int main()
{
int cute = 10;
int x;
int *dhq_pointer;
dhq_pointer = &cute; //利用&地址运算符创建一个指向cute的指针并将其赋给指针变量dhq_pointer
x = dhq_pointer; //利用间接运算符间接访问cute的值并将其赋给变量x
printf(“cute = %d ,x = %d\n”,cute, x);
return 0;
}
输出结果为:
cute = 10, x = 10
当然了这个程序也可以改写成下面这样,得到的结果是一样的
#include<stdio.h>
int main()
{
int cute = 10;
int *dhq_pointer = &cute; //通过地址运算符&将指向变量cute的指针赋给dhq_pointer
printf("%d , %d\n",cute, *dhq_pointer);
return 0;
}
输出结果为:
10, 10
这里要注意一点的就是,在表达式中引用一个变量的值比如cute的值之前一定要先声明该变量cute。
再给出一段程序如下:
#include<stdio.h>
int main()
{
int cute = 10;
int *dhq_pointer = &cute; //通过地址运算符&将指向变量cute的指针赋给dhq_pointer
printf("%d , %d\n",cute, *dhq_pointer);
cute = 8;
printf("%d , %d\n",cute, *dhq_pointer);
*dhq_pointer = 5; //将5这个值赋给dhq_pointer指针间接访问(指向)的变量cute
printf("%d , %d\n",cute, *dhq_pointer);
return 0;
}
这时候输出结果为:
10, 10
8, 8
5, 5
上面这段程序说明当cute的值发生变化时,dhq_pointer的值也会发生变化,因为dhq_pointer仍然指向变量cute。所以除非dhq_pointer的值发生变化,否则表达式dhq_pointer总是访问cute的值。
5、指针指向结构体
我们已经学习了指向基本数据类型的指针,但也可以将指针定义为指向结构体:
定义一个结构体如下:
struct date
{
int day;
int month;
int year;
};
我们可以定义一个struct date类型的变量today:
struct date today;
定义指向struct date类型的指针:
struct date *dateptr;
则可利用下面赋值语句将指针dateptr设定为指向today变量:
dateptr = &today;
这样就能间接访问dataptr所指向的date结构体的任意成员如对其进行赋值操作(注意其中的间接运算符*优先级要低于结构体成员运算符.):
(*dateptr).day = 30;
由于C语言中经常会用到指向结构体的指针,于是在C语言中提供了一个特殊运算符:结构体指针运算符->
(*dateptr).day相当于dateptr->day
6、包含指针的结构体
上面提到指针可以指向结构体类型,其实结构体也可以包含指针,直接上代码看注释:
#include<stdio.h>
struct dhq
{
int *ptr1; //struct dhq结构体包含两个指向int 类型的指针
int *ptr2;
};
int main()
{
struct dhq ptr; //定义一个struct dhq类型的变量ptr
int a = 10, b;
ptr.ptr1 = &a; //将指向变量a的指针赋给ptr1指针
ptr.ptr2 = &b; //将指向变量b的指针赋给ptr2指针
ptr.ptr2 = 30; //相当于(ptr.ptr2),表示将30这个值赋给ptr2指针指向的变量b
printf(“a = %d, *ptr.ptr1 = %d\n”,a, *ptr.ptr1);
printf(“b = %d, *ptr.ptr2 = %d\n”,b, *ptr.ptr2);
return 0;
}
输出结果:
a = 10,*ptr.ptr1 = 10
b = 30,*ptr.ptr2 = 30
未完待续~