C程序设计语言- 指针与数组-4.1----指针与地址、指针与函数参数、指针与数组、地址算术运算

前言:继续C系列,一天不学点感觉不踏实。


        1.指针与地址


一元运算符&可用于取一个对象的地址。

一元运算符*是间接寻址或间接引用运算符。当它作用于指针时,将访问指针所指向的对象。

int x = 1, y = 2, z[10];
	int *ip; /* ip is a pointer to int */

	ip = &x; /* ip now points to x */
	y = *ip; /* y is now 1 */
	*ip = 0; /* x is now 0 */
	ip = &z[0]; /* ip now points to z[0] */


     2.指针与函数参数


由于一元运算符&用来取变量的地址,这样&a就是一个指向变量a的指针。swap函数的所有参数都声明为指针,并且通过这些指针来间接访问他们指向的操作数

	void swap(int *px, int *py) /* interchange *px and *py */
	{
		int temp;
		temp = *px;
		*px = *py;
		*py = temp;
	}


指针函数使用被调用函数能够访问和修改主调函数中对象的值。


    3.指针与数组



为了了解上面的定义,我们来看个例子:

在这里随便定义一个数组

 

     int arr[5];

 

     arr现在就是数组名, arr 代表的是该数组整块内存,即sizeof(arr) == 20 (假设sizeof(int) == 4), arr 里的内容是该块内存的首地址,即 arr == &arr[0]  。 arr可以看做是一个常量,也就不可以使用 arr++ 之类的运算。

 

     int *p;

     p = arr;

 

     p是一个指向int类型的指针,p  = arr,就是把数组的首地址(arr的内容就是数组的首地址,这个前面有分析)赋给p,即 p 现在就是指向数组的首地址,通过 p 就可以访问整个数组,但是 p 这里只是是个指针变量,也就是 p 的本质没有改变,p 不能和 arr 一样代表整个数组的内存, 所以 sizeof(p) == sizeof(int*)  != sizeof(arr)。

     把数组的首地址赋给 p,但 p 的本质一个int类型的指针变量,所以也就可以对 p 进行 ++ 之类的运算。

 

     我们可以通过对 p ,arr 的偏移(int类型的指针 +1 或 -1, 是向上或向下偏移 sizeof(int) 个byte)来访问数组里的元素,         *( p + i ) ,*(arr + i),也可以通过传统的 arr[i] 访问数组。 

 

    

 

 

     举个例子(例子来源于老师上课时讲解的):

 

     int a[5]  = {1, 2, 3, 4, 5};

     int *ptr = (int*)(&a + 1);

     printf("%d, %d", *(a + 1), *(ptr - 1));

 

     这里的输出的值应该是?

 

     a 是 代表(不是指向)的是整个数组内存,a 的值是该数组内存的首地址, 对 a 取地址(&a),即......,所以这里的 &a 是指向整个数组的内存块,所以 a 的值与 &a 的值是一样的,都是该数组的首地址,但他们的含义是不一样的。

     这里 &a 的每次偏移是移动整个内存块的大小,这里就是移动 sizeof(a),即40 byte,所以这里的 &a + 1, 是指针向下移动个40byte(数组内存块的大小),&a+1的指向 是下个 sizeof(a)大小的内存块。

 

 

下面是内存分配图:

 

        &a   ---> ==========  假设这里的地址值是 0x11111111          &a 和 a 的值都是 0x11111111

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值