指针操作:
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;
}