常量与指针,数组与指针
常量与指针
常量与指针的关系很容易弄混,为此我专门在此记录一下。
常量指针
- 指向常量的指针,用const修饰的指针所指向的地址内容不可以改变。
int value = 500;
const int *temp = &value;
如上述代码所示,不能用指针temp去修改value的值,前面的const是为了确保value的值不被temp修改而存在的。(经常会用在函数的形参需要传入指针时,并且不希望形参被修改,而使用const修饰)
···
虽然上述代码中temp不可以用来改变value的值,但是它的指向是可以改变的,如下所示。
#include<stdio.h>
int main()
{
int value1 = 200;
int value2 = 300;
const int *temp;
//先使temp指向value1
temp = &value1;
printf("# %d\n", *temp);
//再使temp指向value2
temp = &value2;
printf("# %d\n", *temp);
getchar();
return 0;
}
- 程序执行结果如下:
# 200
# 300
指针常量
- 特指指针所指的地址不可变(但可通过此指针去修改所指地址的内容)具体表达形式如下。
int value = 200;
int num = 300;
int *const pcount = &value;
//pconut = # //错误操作
上述代码中pcount指向value后将不可以再指向别的地址。
#include<stdio.h>
int main()
{
int value1 = 200;
int value2 = 300;
//temp1指向value1
int *const temp1 = &value1;
printf("# %d\n", value1);
//用temp1修改value1
*temp1 = value2;
printf("# %d\n", value1);
getchar();
return 0;
}
- 程序执行结果:
# 200
# 300
数组与指针
指针与数组的结合中“指针数组”与“数组指针”容易使人混论,原因之一是名字比较绕,另外它们的书写形式也很象。在理解这个问题上,我觉得从符号的优先级上去理解比较容易区分。
指针数组
int *p[3];
如上所示,“[]”的优先级高于“*”,因此可以理解为 3 个 int*,类型的数据,对应的二维数组应该是 int temp[3][] = {};
- 具体应用如下:
#include<iostream>
int main()
{
int *p[3];
int temp[3][3] = {
{0,1,2},
{3,8,7},
{6,9,4}
};
for (int i = 0; i < 3;++i)
{
p[i] = temp[i];
}
//用指针数组打印temp数组的数据
for (int i = 0;i < 3;++i)
{
for (int j = 0;j < 3;++j)
{
std::cout << temp[i][j] << " ";
}
}
getchar();
return 0;
}
- 程序执行结果如下:
0 1 2 3 8 7 6 9 4
数组指针
int (*p)[3];
如上所示,“()”的优先级高于“[]”,因此可以理解为指针p指向了int类型且大小为3的一维数组的首地址。
数组指针与二维数组
int *p[3];
//可将上述的数组指针理解为 int p[][3] = {};
- 具体例子如下:
#include<iostream>
int main()
{
int (*p)[3];
int temp[3][3] = {
{0,1,2},
{3,8,7},
{6,9,4}
};
p = temp;
//用指针数组打印temp数组的数据
for (int i = 0;i < 3;++i)
{
// p+1 相当于加3个int类型的长度
std::cout << (*(p + i))[0] << " " << (*(p + i))[1] << " " << (*(p + i))[2] << std::endl;
}
getchar();
return 0;
}
- 执行结果如下:
0 1 2
3 8 7
6 9 4
网友评论