鸟语天空
C语言—指针操作
post by:追风剑情 2019-10-9 20:27

指针操作:

  1. 赋值:可以把地址赋给指针。
  2. 解引用:*运算符给出指针指向地址上储存的值。
  3. 取址:和所有变量一样,指针变量也有自己的地址和值。
  4. 指针与整数相加:可以使用+运算符把指针与整数相加,或整数与指针相加。
  5. 指针与整数相减:可以使用-运算符从一个指针减去一个整数。
  6. 递增指针:如,ptr++
  7. 递减指针:如,ptr--
  8. 指针求差:可以计算两个指针的差值。通常,求差的两个指针分别指向同一个数组的不同元素,通过计算求出两元素之间的距离。
  9. 比较:使用关系运算符可以比较两个指针的值,前提是两年指针都指向相同的类型对象。

C只能保证指向数组任意元素的指针和指向数组后面第1个位置的指针有效

千万不要解引用未初始化的指针,例如:double *pd; *pd = 2.4; //错误,pd未初始化。可以用一个变量或者malloc()来初始化指针(让指针指向一个正确的内存地址)。

示例

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	int urn[5] = {100,200,300,400,500};
	int *ptr1, *ptr2, *ptr3;

	ptr1 = urn; // 把一个地址赋给指针
	ptr2 = &urn[2]; // 把一个地址赋给指针
	// 解引用指针,以及获得指针的地址
	printf("pointer value, dereferenced pointer, pointer address:\n");
	// %p用来打印地址
	// 如果编译器不支持%p,可用%u或%lu代替。
	// 如果编译器不支持%td打印地址的差值,可用%d或%ld代替。
	printf("ptr1=%p, *ptr1=%d, &ptr1=%p\n", ptr1, *ptr1, &ptr1);

	// 指针加法
	ptr3 = ptr1 + 4;
	printf("\nadding an int to a pointer:\n");
	printf("ptr1 + 4 = %p, *(ptr1 + 4) = %d\n", ptr1 + 4, *(ptr1 + 4));
	ptr1++; //递增指针
	printf("\nvalues after ptr1++:\n");
	printf("ptr1=%p, *ptr1=%d, &ptr1=%p\n", ptr1, *ptr1, &ptr1);
	ptr2--; //递减指针
	printf("\nvalues after --ptr2:\n");
	printf("ptr2=%p, *ptr2=%d, &ptr2=%p\n", ptr2, *ptr2, &ptr2);
	--ptr1; //恢复为初始值
	++ptr2; //恢复为初始值
	printf("\nPointers reset to original values:\n");
	printf("ptr1=%p, ptr2=%p\n", ptr1, ptr2);

	// 一个指针减去另一个指针
	printf("\nsubtracting one pointer from another:\n");
	printf("ptr2=%p, ptr1=%p, ptr2 - ptr1 = %td\n", ptr2, ptr1, ptr2-ptr1);

	// 一个指针减去一个整数
	printf("\nsubtracting an int from a pointer:\n");
	printf("ptr3=%p, ptr3-2=%p\n", ptr3, ptr3-2);

	system("pause");
	return 0;
}

运行测试
1111.png

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容