zoukankan      html  css  js  c++  java
  • c语言那些细节之a+1和&a+1的区别

    首先a是一个数组名,当看到这个a&a时,一般我们的理解都是这个数组的首地址。没错,如果加上打印的话,确实两个值是一样的。

    不过&a是整个数组的首地址,a则是数组首元素的地址,虽然值一样,但是意义却不相同。

    在此之前有必要先看下c程序在内存中的分布图。



    下面来看一个例子吧还是。

    示例代码:

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
    	int i;
    	int a[]={1, 2, 3, 4, 5};
    	int s;
    	int *p = (int *)(&a+1);
    	printf(" a = %p\n&a = %p\n", a, &a);
    	for(i = 0; i < 5; i++)
    		printf("a[%d] = %p\n", i, &a[i]);
    	printf(" p = %p\n&p = %p\n&s = %p\n", p, &p, &s);
    	return 0;
    }

    运行结果:

     

    a = 0022FF40
    &a = 0022FF40
    a[0] = 0022FF40
    a[1] = 0022FF44
    a[2] = 0022FF48
    a[3] = 0022FF4C
    a[4] = 0022FF50
     p = 0022FF54
    &p = 0022FF38
    &s = 0022FF3C

    由上面的运行结果,我们可以知道a&a的区别了。可得下图:



    因为是运行在main函数体内的变量,所以这些都是在栈中运行的,所以p指针是指向了a[4]后的那个地址,而p本身的地址是在栈中分配的。

    综上可知:

    &a+i = a + i*sizeof(a);
    a+i = a +i*sizeof(a[0]); 

  • 相关阅读:
    开发趋势
    常用的meta
    meta基础
    HTTP请求方法GET和POST
    same-origin policy----wikipedia
    跨域——同源策略(译)
    DNS问答
    TCP/IP的整理
    鉴权方法
    Web攻击技术---OWASP top
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300017.html
Copyright © 2011-2022 走看看