C语言指针(1):什么是指针

什么是指针

打个比方,有一本书,书籍中的页码就可以被认为是指向相应页面的指针; 我们可以翻到书籍目录中对应的页码来查看某一页的内容,对应的,在计算机中我们通过使用指针来访问某一内存地址中储存的内容。

1. 指针
一个变量的地址称为该变量的指针

定义指针变量的一般形式为:类型名 * 指针变量名 如:

int * p_1, * p_2; 
  • 说明
    1.指针变量前面的“ * ”表示该变量的类型为指针变量。
    2.在定义指针变量时必须指定基类型

上面代码中的指针变量是p_1和p_2,而不是 * p_1 和 * p_2,而且引用指针变量是对指针变量操作。

2. NULL指针

如果你在声名指针变量后没有要分配的确切地址,最好将NULL值分配给指针变量。这是在变量声明时完成的。指定为NULL的指针称为空指指针

NULL指针是在几个标准库中定义的值为零的常量。

参考以下程序:

#include <stdio.h>

int main () {

   int  *ptr = NULL;

   printf("The value of ptr is : %x\n", ptr  );
 
   return 0;
}

编译并执行上述代码后,会产生以下结果 :

The value of ptr is 0

在大多数操作系统中,不允许程序访问地址0处的内存,因为该内存是由操作系统保留的。但是,存储器地址0具有特殊意义; 它表示指针不是指向可访问的内存位置。但按照惯例,如果指针包含null(零)值,则假定它指向任何内容。

3. 指针变量的引用

1.给指针变量赋值

p = &a;	//把a的地址赋给指针变量

其作用是将p指向a。

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

printf("%d", * p);
* p = 1;

上面第一条语句作用是以整形输出p所指向的变量的值,第二语句作用是将1赋给p所指向的变量。

3.引用指针变量的值

printf("%o", p);

其作用是以八进制输出p的值,若p指向a就是输出a的地址。

注意:
(1) & 取地址运算符。&a是变量a的地址
(2) * 指针运算符。*p代表指针变量p指向的对象。

#include<stdio.h>
#include<Windows.h>

int main()
{
	int  *p, *p1, *p2, a, b;
	printf("请输入两个整数:\n");
	scanf("%d %d", &a, &b); 			//输入两个整数
	p1 = &a; 							//使p1指向a
	p2 = &b; 							//使p1指向a
	if (a < b)
	{
		p = p1; p1 = p2; p2 = p; 		 //如果a<b,p1和p2的值互换
	}
	printf("a=%d, b=%d\n", a, b);		 //输出a和b
	printf("max=%d, min=%d\n", *p1, *p2);//输出p1和p2所指向的变量的值
	system("pause");
	return 0;
}

运行结果:

请输入两个整数:
5 9
a=5, b=9
max=9, min=5
请按任意键继续. . .

注意:
a和b的值并未交换,但p1, p2的值改变了。p1的值原为&a,后来变成&b,p2的值原为&b,后来变成&a。这样在输出*p1, *p2时,实际上是输出变量b和a的值。

4. 指针的运算
c中的指针是地址,它是一个数值。因此,您可以像对数值一样对指针执行算术运算。可以在指针上使用四个算术运算符:++, - ,+和 -
要理解指针运算,让我们考虑ptr是一个指向地址1000的整数指针。该指针为假设32位整形,我们对指针执行以下算术运算:

ptr ++;

在上述操作之后,ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整型位置,该位置是当前位置旁边的4个字节。此操作将指针移动到下一个存储器位置,而不会影响存储器位置的实际值。

如果ptr指向地址为1000的字符,则上述操作将指向位置1001,因为下一个字符在1001处可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值