作者邮箱:z_zhanghaobo@163.com
github相关: https://github.com/HaoboLongway/simple_examples
指针指向的是地址,与通常的整型有不同的含义,其也可以进行以下几类运算,但时刻要记得指针是一个地址值。
以下的例子以下例为前提:
int test_ar[5] = {0, 1, 2, 3, 4};
int * p1, *p2, *p3;
-
赋值
可以把地址赋给指针,
p1 = p2 = p3 = test_ar;
这样,p1
p2
p3
均指向test_ar
的首元素
2.解引用
*
运算符给出地址上储存的值,在之前基础上,执行以下代码
...
cout<<setw(8)<<"Value"<<setw(12)<<"Address"<<endl;
cout<<"*p1"<<setw(4)<<*p1<<setw(14)<<p1<<endl;
cout<<"*p2"<<setw(4)<<*p2<<setw(14)<<p2<<endl;
...
输出结果是
Value Address
*p1 0 0x6dfed0
*p2 0 0x6dfed0
-
取地址
和所有变量一样,指针变量也有自己的地址和值.
cout<<&p1<<'\t'<<&p2<<'\t'<<&p3<<endl;
结果是:
0x6dfed0 0x6dfecc 0x6dfec8
我们还可以用一个指针指向p1
等,如:
int ** couter_p;
couter_p = &p1;
...
此外,值得注意的一点是,p1
是高地址,而p3
是低地址,表明p1 = p2 = p3 = test_ar;
初始化是由右向左进行的.
-
与整数相加
可以用+
运算符把指针和整数相加,或整数与指针相加。无论哪种情况,整数都会与指针所指类型大小(以字节为单位)相乘,然后把结果与初始地址相加,例如p1 + 3
即与&test_ar[3]
等价. -
递增指针
递增指针可以“就地”改变其地址值,进而移动到下一处。假如我们想要把test_ar
里的数值全部打印出来,可以下面这样做
while(p1<(test_ar+5)){
cout<<*p1<<'\t';
p1++;
}
结果如图
0 1 2 3 4
-
对指针的比较
使用关系运算符可以比较两个指针的值,前提是两个指针都指向相同的数据类型,如前面的一行语句p1<(test_ar+5)
就进行了比较 -
指针减去一个整数
得到的结果仍是一个指针,与指针加上一个整数,这里就不赘述了 -
递减指针
与递增指针同理 -
指针求差
我们可以计算两个指针的差值,通常,求差的两个指针分别指向同一个数组的不同元素,通过计算可以求出两元素间的距离。差值的单位与数组类型的单位相同。例如,
p1=test_ar;
p2=test_ar;
p2++;
cout<<(p2-p1);
输出结果为1
这里输出的结果是数组test_ar
相邻两元素距离是1,而字节占4个(int
占4个字节),底层的地址差了4个字节。
题目4-1-1:
下列关于指针描述错误的是:
A. 在一定条件下,两个指针可以相加
B. 在一定条件下,两个指针可以进行关系运算
C. 在一定条件下,指针可以为空
D. 在一定条件下,两个指针可以相互赋值
答案:A
指针的运算不包括两指针间的加法,两指针可以进行关系运算(上面有示例),也可以相互赋值如int *p1, *p2, *tmp, a=1, b=2; p1 = &a; p2 = &b; tmp = p1; p1 = p2; p2 = tmp;
其逻辑无异。
题目4-1-2:
其余文章:
数组与指针基础内容: