指针与数组

1.常量指针和指针常量

常量指针即const在星号前面,被限制的指针只可以更改指针朝向(地址),不能更改解引用的值
指针常量即const在星号后面,被限制的常量只可以更改解引用的值,不能更改指针朝向(地址)
小技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量

int main() {

	int a = 10;
	int b = 10;

	//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
	const int * p1 = &a; 
	p1 = &b; //正确
	//*p1 = 100;  报错
	

	//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
	int * const p2 = &a;
	//p2 = &b; //错误
	*p2 = 100; //正确

    //const既修饰指针又修饰常量
	const int * const p3 = &a;
	//p3 = &b; //错误
	//*p3 = 100; //错误

	system("pause");

	return 0;
}

2.C/C++中指针与数组的语法糖

在c中指针和数组似乎有着千丝万缕的关系。其实它们不是一回事:指针是指针,数组是数组,两者不相同。说它们有关系,不过是因为常见这样的代码:

int main()
{
    int array[]= {1,2,3,4,5};
    int n=sizeof(array)/sizeof(int);
    int *p=array;
    int i;
    for(int i=0; i<n; i++)
    {
        printf("p[%d]...%d\n",i,p[i]);
        printf("*(p+%d)...%d\n",i,*(p+i));
        printf("------------------------------\n");
    }

    system("pause");
    return 0;
}

其输出结果是这样:
示例
在上面的代码中,指针和下标运算符的结合使用,给人一种指针和数组是一样的感觉。

本质是:数组名是一个指向数组起始元素的常量指针。这也是数组和指针的唯一联系!

之所以可以使用 p[i] 来访问数组中的元素,是因为在编译器中 p[i] 被解释为 *(p+i),可以理解为:p这个指针向右移动了4*i个字节,数值通过索引取值也是通过指针移动实现的。这仍然是指针的功能。对编译器而言,用p[i]表达*(p+i)的含义是没有意义的,它只是为了让人看着舒服,用着方便。这是语法糖: p[i]是*(p+i)的简单写法,实际上,至少对于编译器来说,[]这样的运算符完全可以不存在。可是对于人类来说,*(p+i)的写法在解读上比较困难,写起来也麻烦(键入量大)。因此,c语言引入[]运算符。 就像这样,这些仅仅是为了让人类容易理解而引入的功能,的确可以让我们感受到编程语言的甜蜜味道(容易着手),有时我们称这些功能为语法糖(syntax sugar 或者 syntactic sugar)。

3.不管是否在函数声明形参为任何类型,作为形参传入函数的数组就是个指针(代表数组第一个元素的地址)

void fun(int array[5])
{
    printf("  sizeof(array)...%d\n", sizeof(array));
}
int main()
{
    int array[] = { 1, 2, 3, 4, 5 };
    printf("  sizeof(array)...%d\n", sizeof(array));
    fun(array);
    return 0;
}

输出结果如下:

在这里插入图片描述
注意:任何数据类型的指针都是4个字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值