精华内容
下载资源
问答
  • 2、对数组名取地址获得的值和对数组第一个元素取地址获得的地址值是否一样? 2、值是一样的。 3、上面第二问中。两种方式取得的地址的类型是否一样? 3、不一样,对数组名取地址,取得的是整个数组的地址首地址,...

    1、数组名是什么?
    1、数组名是一个符号地址常量,是数组的起始地址。

    2、对数组名取地址获得的值和对数组第一个元素取地址获得的地址值是否一样?
    2、值是一样的。

    3、上面第二问中。两种方式取得的地址的类型是否一样?
    3、不一样,对数组名取地址,取得的是整个数组的地址首地址,相当于数组指针。
    对数组第一个元素取地址获得的地址就是第一个元素的地址,相当于整型指针。

    展开全文
  • c语言对数组取地址

    2014-10-02 20:17:38
    现在又这样一个问题,如果对数组取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,既二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了。 下面我们来逐步分析,...

    相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。现在又这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,既二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了。


    下面我们来逐步分析,下面是一段验证这个问题的代码

    Code:
    1. #include<stdio.h>   
    2. int main()   
    3. {   
    4.     int a[10];   
    5.   
    6.     printf("a:/t%p/n", a);            
    7.     printf("&a:/t%p/n", &a);          
    8.     printf("a+1:/t%p/n", a+1);        
    9.     printf("&a+1:/t%p/n", &a+1);     
    10.   
    11.     return 0;   
    12. }  

     

    大家可以编译运行一下,我的输出的结果是:

    Code:
    1. /*   
    2. a:          0012FF20  
    3. &a:         0012FF20  
    4. a+1:        0012FF24  
    5. &a+1:       0012FF48  
    6. */  

    a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)。既a和&a的指向和&a[0]是相同的,但性质不同!

    读到这里,有很多朋友已经明白其中的机制了,如果还是有些模糊,请继续往下看

    Code:
    1. int main()   
    2. {   
    3.     int a[10];   
    4.     printf("%d/n",sizeof(a));   
    5.     return 0;   
    6. }  

    这段代码会输出整个数组的内存大小,而不是首元素的大小,由此我们是否联系到,sizeof(a)这里的a和
    &a有些相同之处呢?!  是的,没错,&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。


    好了,让我们总结一下,如果你还是不太理解,不用担心,下面的概念很清晰


    其实a和 &a结果都是数组的首地址,但他们的类型是不一样。
    a表示&a[0],也即对数组首元素取地址,a+1表示首地址+sizeof(元素类型)。
    &a虽然值为数组首元素地址,但类型为:类型 (*)[数组元素个数],所以&a+1大小为:首地址+sizeof(a)。

    还有这篇文章最初提到的指针的指针的那个错误结论,其实即使不懂上述内容,也应该判断出结论是错误的,大家应该在了解数组名即是数组的首地址的同时,也要知道,数组名仅仅是“相当”于指针,而并非真的是指针,数组名是只是个常量(一个值为数组首元素地址的常量),所以不能进行++或者--运算。而常量更是无法取地址的,而之所以有&a,其实这里的a的意义早已经不是当初那个数组名了,它此时代表了整个数组。

    展开全文
  • 对数组取地址

    千次阅读 2010-10-26 19:50:00
    int a[5]={1,2,3,4,5}; int b[100]; 一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题 ... 答一: 对数组取地址在C标准里面是未定义的行

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

    int b[100];

    一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题

    问题一:
    看到一篇文章这么写的。。
    int array[10];
    int (*ptr)[10];
    ptr=&array;//这里说明&array是指向数组的指针,但为什么&array是指向数组的指针?
    答一:
    对数组名取地址在C标准里面是未定义的行为。由于数组名是右值,而&操作符要求操作数具有具体的内存空间,换言之就是一个变量,因此对数组名取地址本来就是非法的,早期的编译器明确规定这是非法的。不过不知道什么原因,现在的编译器多数把&array定义为一个值跟array相同,类型是一个指向数组的地址,注意了,是地址,不是指针。之所以是指向数组的地址,是因为array是一个数组名,它就代表了int array[10]这个数组。而ptr也是定义为一个指向具有10个int数的数组的指针,因此&array能被赋予ptr。
     
    问题二:
    对于数组b[],b是数组的地址,但b不算变量,有没有一个地方存放b?而且b是不
    是存放的就是自己所在的地址。因为我碰到了如下的问题:
    定义一个指针数组
    char *a[2];
    那么a的值和&a的值是不是应该一样?
    答二:
    数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以你说的有没有一个地方存放b,可以认为程序没有给其分配空间,数组名只是代表了那个数组空间;与指针不一样,指针指向一块空间,同时指针本身也存储在某个空间;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异,VC是合法的。


    然后我们来看一段测试Demo

    结果如下

    为什么ptr-1的大小是5呢?是否你也像我一样认为是2,1呢?

    对指针进行加1操作,得到的是下一个元素的地址,一个类型为T的指针移动,以sizeof(T)为移动单位,

    如果ptr=a+1,那么最终输出*(ptr-1)肯定是2,1

    但是ptr=&a+1,为什么就是2,5呢?

    虽然前面我们讲对数组取地址不合法,但是我们这样做在编译器看来确实获得了数组a的首地址,&a 是一个指向 int[5] 的指针。但是这时候ptr相当于int *[5],也就是指向了一个含有五个元素的数组,这也就不难解释为什么第二个打印出来&b的大小也是400了,sizeof(b)打印出来的是b数组的大小。sizeof(&b)同样也是。
    为此我们将他们的地址打印出来查看
    不难看出,&a+1的地址是&a地址再加5*sizeof(int);它的运算单位是int (*)[5]
    最后ptr-1,ptr-1的单位是ptr的类型,因此ptr-1的位置刚好是a[4],他在内存中的分布位置是和&a+1相邻的
    展开全文
  • 对数组取地址赋值给数组指针与普通指针的区别: 以下红色字体的说法是错误的: 使用一级指针来接受&amp;arr,只是表示一个普通的一级指针, 它并没有接收到&amp;arr赋来的跨度,而只接收到了地址而已。...

    对数组名取地址赋值给数组指针与普通指针的区别:

    以下红色字体的说法是错误的:
        使用一级指针来接受&arr,只是表示一个普通的一级指针,
        它并没有接收到&arr赋来的跨度,而只接收到了地址而已。所以,
        p1的跨度只有4个字节。它保存的地址所表示的是arr这个数组的首元素地址
        相当于在赋值过程中,&arr退化为了arr,失去了数组本来拥有的跨度。
        此时p1[i],就是在对数组中的每一个数组元素做遍历了。

    p保存的是数组的地址&arr
    *p保存的是数组首元素的地址:*&arr ---> arr

    同理,以下红色字体的说法同样不正确:
        p2此时的地址已经为arr,*p2就是数组元素的值了。
        而二级指针的特点就是在于它保存的是一级指针的地址,即它的内容就是一级指针的地址。
        *p2就是这个一级指针的地址。
        *(*p2)则为对元素的值取地址,因为数组元素的值是手动赋值的,
        那么**p此时就是对野指针的非法操作了。

       p为&arr首地址
       *p为arr首元素地址
       **p为数组元素内容

    综上:一维数组名对应一级指针,二维数组名对应二级指针,n维数组名对应n级指针。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc, char *argv[])
    {
    	int arr[5] = {1, 2, 3, 4, 5};
    	/*一下的说法是错误的:
    	数组指针才是将地址连同&arr这个地址的跨度一起赋给了指针变量;
    	而是用普通的一级指针来接受的&arr,只是表示一个普通的一级指针,
    	它并没有接收到&arr赋来的跨度,而只接收到了地址而已。所以,
    	p1的跨度只有4个字节。它保存的地址所表示的是arr这个数组的首元素地址
    	相当于在赋值过程中,&arr退化为了arr,失去了数组本来拥有的跨度。
    	此时p1[i],就是在对数组中的每一个数组元素做遍历了。
    	*/
    	//p保存的是数组的地址&arr
    	//*p保存的是数组首元素的地址:*&arr ---> arr
    	int *p1 = &arr;  //其实此处不需要取地址,将二级指针赋值给一级指针会有警告。
    
    	for (int i = 0; i < 5; i++)
    	{
    		printf("%d\n", p1[i]);
    	}
    	printf("------------------------------\n");
    	
    	//*的优先级为2级,[]、()的优先级为1级
    	//p2的内容是&arr
    	//*p2的内容是*&arr ---> arr,即数组的首元素地址
    	//
    	int (*p2)[5] = &arr;
    	for (int i = 0; i < 5; i++)
    	{
    		printf("%d\n", (*p2)[i]);
    	}
    	printf("------------------------------\n");
            /*同理,以下的说法同样不正确:
    	p2此时的地址已经为arr,*p2就是数组元素的值了。
    	而二级指针的特点就是在于它保存的是一级指针的地址,即它的内容就是一级指针的地址。
    	*p2就是这个一级指针的地址。
    	*(*p2)则为对元素的值取地址,因为数组元素的值是手动赋值的,
    	那么**p此时就是对野指针的非法操作了。	
    	*/
    
    	//p为&arr首地址
    	//*p为arr首元素地址
    	//**p为数组元素内容
    	int **p = &arr;
    	for (int i = 0; i < 5; i++)
    	{
    		printf("%d\n", p[i]);
    	}
    
    
    	system("pause");
    	return 0;
    }
    
    展开全文
  • 对数组元素进行固定阈值操作,该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像阈值的方法由 threshold_...
  • 对数组取地址打印出来的结果与直接打印数组名得到的结果是同一个地址,如: C/C++ code? 1 2 3 4 5 6 7 8 9 10 #include    int main(void) { ...
  • c/c++对数组取地址

    千次阅读 2015-07-28 23:23:39
    没怎么用过c/c++,今天偶然...初看起来有点奇怪,因为数组名是指针,那直觉上&a应该是对a这个指针变量取地址,所以结果应该是不一样,这是为什么? 原来实际上,a是指向a[0]的指针,而&a是指向整个数组的指针。
  • 数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;  所以说没有一个地方存放数组名,可以认为...a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定义对数组名取地
  • 对数组取地址的一点问题

    千次阅读 2009-10-28 15:25:00
    在看《深入浅出MFC》的时候,遇到了如题的问题,去网上查了下,原来如此原帖地址...[4] 我通过下面一段程序发现:通常说a实质是数组的地址,那么: int a[3][4]; co
  • 两个对数组元素求和,求积的算法题求数组的子数组元素和的最大值。 思路: 遍历数组一遍,如果遇到负数则对累加结果清零。同时记录累加值所达到的最大值。代码块int maxsum(int *num, int n) //求数组子数组和的...
  • Python对数组取并集倒是挺简单的,但是数组中的元素不是像1234这样简单的数据,数组中的元素是字典,然后我怎么根据数组中字典的其中一个key来并集
  • /*用Arrays类sort()对数组元素进行升序降序排列**@Author:莫笑书生*@Version:2010-1-2 V1.0*/import java.util.Arrays;class SortDemo{ public static void main(String[] args) { int[] vec={0,15,-14,45,20,70};...
  • 对于一个数组元素是对象,按照元素对象中某一个属性的值进行去重。 元数据准备: var Phas = new Array();//定义一个数组 for(var i = 0;i;i++){ var A = new Object(); A.deptCode = rows[i].orgidExec;
  • C++ 编写函数对数组中的元素求和

    千次阅读 2018-04-07 17:57:02
    题目内容:编写函数 add_array 对数组中的元素求和,函数原型为:void add_array(int a, int *sum);该函数可以重复调用多次,每次只使用参数a传入数组中的一个元素,函数内部可以累计历次传入的值进行求和,每次执行...
  • python如何对数组求指数以及对数

    万次阅读 2019-12-25 18:21:36
    指数: math.exp() 只能对一个数求指数,不能对数组进行批量求指数 numpy.exp()既能对一个数求指数,也能对数组进行批量求指数 对数: math.log() numpy.log() 作用同上 ...
  • 在numpy中,对数组或矩阵中的每个元素,进行函数计算 2019年12月6日 数据分析日记 今天学到了一个利用自建函数,对numpy矩阵种元素进行计算的新招 假设有一个数组或矩阵: (0110) \left( \begin{array}{ccc} 0 &...
  • 需求 js对数组中相同对象元素进行去重,里面对象相同id,其他不同属性进行文字叠加 let arr1 = [ { id: 1, name: 'ui1' }, { id: 2, name: 'ui2' }, { id: 2,
  • C语言--对数组地址的解析

    千次阅读 2013-07-29 13:54:03
    在C编程中,我们进程会用到数组,这看起来很简单,因为,数组就是存储相同类型元素的集合嘛,不过,当你还没考虑到数组的地址问题时,一切都是简单的,如果你接触了数组中的地址概念,也许你会改变你的想法。...
  • 前台对数组进行操作时,经常需要用到 :找出两个数组的相同元素、不同元素、数组去重 操作。因此 特来总结一下: 1、找出两个数组的相同元素: var arr1 = [1, 2, 3, 4, 5]; var arr2 = [2, 4, 6, 8]; var ar = ...
  • 本文给出C语言对数组的各种操作程序,感性趣的朋友可以参考下。
  • 对数组元素a[i]可以写成*(a+i) 如果对这2种形式分别&则&a[i]与(a+i)相同的 (a+i)是a之后第i个元素的地址同样的如果pa是一个指针,那么,在表达式中也可以再它的后面加下标。pa[i]与*(pa+i)是等价的,而pa[i...
  • 对数组进行重新排序

    千次阅读 2017-08-15 01:26:34
    很多时候,我们从数据库中取出我们要的数据后,并不是就完成了工作,更多的我们需要对数据进行遍历处理等,这时候我们从数据库中获取数据时...rsort() //以降序对数组排序 asort() //根据值,以升序对关联数组进行排序
  • perl对数组的操作

    万次阅读 2013-11-14 10:43:37
    当Perl数组变量出现在预期简单变量出现的地方,则PERL解释器其长度。 @array=(1,2,3); $scalar=@array;#$scalar=3,即@array的长度 ($scalar)=@array;#$scalar=1,即@array第一个元素的值 注:以Perl数组的...
  • tensorflow对数组排序

    千次阅读 2018-07-24 12:07:28
    根据对应索引indices把对应元素取出来 '''   feed_dict = {a:np.array([[1, 2], [3, 4], [2, 2]])} sess = tf.Session() _in, out, v, i = sess.run([a, reordered, value_, indices_], feed_dict=feed_dict...
  • 利用js对数组进行全排列

    千次阅读 2018-11-19 09:27:39
    从n个不同元素中任m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 &lt;!DOCTYPE html&gt; &lt;html lang="en"&...
  • 对数组的引用

    千次阅读 2012-10-01 20:36:52
    因为&的优先级低于[],所以要加上圆括号,不加圆括号,则表示数组的每个元素的类型为int &: int &rcp[10]; 如果将数组名理解为常量指针,则也可以这样写: int *const &rcp1 = arry;//reference ...
  • 用numpy批量求指数、对数
  • VB编程:对数组进行二分查找-29

    千次阅读 2016-11-29 09:54:03
    运行效果 程序代码 Option Explicit Dim myarray(100) As Integer ... '定义数组,下标0-100,数组元素为101个 Private Sub Command1_Click()  Dim low, high, mid, n As Integer  Dim found As Boolean  ...
  • 数组名 a、数组首元素的地址 &a[0]、数组名取地址 &a,这三者在内存中其实是同一个地址,但访问内存的尺度有所不同,其中 a 和 &a[0] 是以 int 类型所占内存空间为尺度来访问内存,而 &a 是以数组 int a[3] 所占内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,314
精华内容 20,925
关键字:

对数组元素取地址