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