1. *和&运算符:运算符&是返回操作数地址的单目运算符,叫做取地址运算符;*是指针运算符,它返回指定地址内的变量的值。两个运算符的优先级相同,结合方向为自右向左。&*p相当于先进行*运算,再进行&运算,相当于取变量p的地址;*&p先进行取地址操作,然后再进行取值,相当于取变量p所在地址的值。
2. 指针的自加和自减:自加和自减并不是加减一个字节,而是按照它所指向的数据类型的直接长度进行加减。
#include<iostream> #include<cstring> using namespace std; int main() { int i = 0; int *p = 0; cout << "请输入一个数:"; cin >> i; p = &i; cout << "p = " << p << endl; p++; cout << "p++ = " << p++ << endl; //加减并不是一字节 cout << "++++++++++" << endl; short j = 0; short *q = 0; cout << "请输入一个数:"; cin >> j; q = &j; cout << "q = " << q << endl; q++; cout << "q++ = " << q++ << endl; //加减并不是一字节 return 0; } 请输入一个数:5 p = 0136FCA4 p++ = 0136FCA8 ++++++++++ 请输入一个数:5 q = 0136FC8C q++ = 0136FC8E 请按任意键继续. . .3.一维数组与指针:对于数组来说,数组名就是数组在内存中存储的首地址,指针可以用于存放数组的首地址或者数组元素的值。若将一个数组的首地址传给指针变量,则该指针指向数组。
#include<iostream> #include<cstring> using namespace std; int main() { int *p1 = 0, *p2 = 0; int arr1[5] = { 0 }; int arr2[5] = { 0 }; int i = 0; p1 = arr1; //等价于p1=&arr1[0] p2 = &arr2[0]; printf("输入数组arr1的元素:\n"); for (i = 0; i < 5; i++) { scanf_s("%d", &arr1[i]); } printf("输入数组arr2的元素:\n"); for (i = 0; i < 5; i++) { scanf_s("%d", &arr2[i]); } for (i = 0; i < 5;i++) { printf("=", *(p1 + i)); } printf("\n"); for (i = 0; i < 5; i++) { printf("=", *(p2 + i)); } return 0; }输入数组arr1的元素: 1 2 3 4 5 输入数组arr2的元素: 4 5 6 7 8 1 2 3 4 5 4 5 6 7 8请按任意键继续. . . p+n与arr+n都表示元素arr[n]的地址,即&arr[n]; 各元素的值分别为:*(p+n)和*(a+n); 将之前的代码语句 printf("=", *(p1 + i));改为 printf("=", *(arr1+ i));输出结果不变。 将之前的代码语句 scanf_s("%d", &arr1[i])改为scanf_s("%d", p1++); printf("=", p1++);改为printf("=", p2++);输出结果不变,但是输出结果之前要先将p1和p2指针指向数组的第一个元素。