精华内容
下载资源
问答
  •  b是数组名, 数组名是地址, 但此时是作为常量,不可作为左值,不可以自增数组名是地址 它不是变量 数组才是变量   int b[]={10,20,30,40,50};  int i, *k;  k=&b[4]-4;  for (i=0; i  {  cout ...

     如下, k 是变量, 它存得是地址, 变量可以作为左值,可以自增。

                  b是数组名,  数组名是地址, 但此时是作为常量,不可作为左值,不可以自增; 数组名是地址 它不是变量 数组才是变量

     

    int b[]={10,20,30,40,50};
     int i, *k;
     k=&b[4]-4;
     for (i=0; i<=4; i++)
     {
      cout << *k << " "; //依次输出每一个数组元素
      k++; //k 是变量, 它存得是地址, 变量可以作为左值,可以自增。
     }
     cout<<endl;

     cout<<"b = "<<b+1<<endl; //输出的是第一个元素地址
     cout<<"&b[0] = "<<&b[0] + 1<<endl;
     cout<<"b = "<<b++<<endl; //数组名表示得是地址 不能做为左值 , b++ 表示的是b=b+1
     cout<<"&b[0] = "<<&b[0]++<<endl; // &优先级高于++, 同(&b[0])++, 也是地址自增,但此时地址是常量,而不是变量,同上,编译出错

     

    比如说 int a[5],b[3]={1,2}; 你只会 a[1]=b[1]; 这样 。 应该不会a=b把。

     

    数组名不是变量 不能做左值

    指针你可以把它看做一个整型(但不是)数据类型 它是一个变量 存储得是一个地址 比如你可以把一个地址赋值给它,这时指针变量就存储这个地址,再把另一个地址赋值给它, 这时指针变量就存另一个地址,它是可以变的,所以可以作为左值。

    数组,你声明一个数组,系统就分配了一个内存单元 这时数组名表示得是这个数组首元素得地址,这个地址是不能变得,可以把它看做(但不是)常量,所以不能作为左值 。

    展开全文
  • C++数组地址偏移

    千次阅读 2017-07-19 06:34:26
    数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。对数组名进行运算处理可以看成是对数组地址进行了偏移,而偏移的单位可能是数组中元素的大小,也有可能是整个数组的大小。

    C++中数组名可以作为数组的首地址使用。数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。对数组名进行运算处理可以看成是对数组地址进行了偏移,而偏移的单位可能是数组中元素的大小,也有可能是整个数组的大小。

    1 偏移单位是数组中元素的大小

    有如下代码

    int ptr[] = {5, 6, 7, 8};
    int *pValue = (ptr+1);
    ptrpValue的值如图1所示

     

    1 ptrpValue的值

    从图中可以看到,在表达式中,pValueptr偏移了一个单位;但是在内存地址中,偏移了0x0073fdfc-0x0073fdf8=4字节,这4个字节即为ptr数组中每个元素(int类型)的大小。

    2 偏移单位是整个数组大小

    有如下代码

    int *pValue = (int*)(&ptr+1);
    此时&ptrpValue的值如图2所示。

     

    2 &ptrpValue的值

    从图中可以看到,在表达式中,pValue&ptr偏移了一个单位;但是在内存地址中,偏移了0x006ff830-0x006ff820=16字节,这16个字节即为ptr数组的大小。

    3 偏移单位是一个字节

    有如下代码

    int *pValue = (int*)((int)ptr+1);

    此时,ptr的值看作是一个int,如果此时ptr的值是0x006ff820,则((int)ptr+1)的值是0x006ff821,

    那么0x006ff820的地址上对应的值为 05 00 00 00 06 00 00 00 07 00 00 00 

    那么0x006ff821的地址上对应的值为00 00 00 06 00 00 00 07 00 00 00 08

    所以pValue的值是0x06000000,即100663296

    展开全文
  • 数组名不能做自增或自减

    千次阅读 2013-10-19 10:29:32
    如下, k 是变量, 它存得是地址, 变量可以作为左值,可以... b是数组名, 数组名是地址, 但此时是作为常量,不可作为左值,不可以自增数组名是地址 它不是变量 数组才是变量 int b[]={10,20,30,40,50}; i

    http://blog.csdn.net/firefly_2002/article/details/8108468

    如下, k 是变量, 它存得是地址, 变量可以作为左值,可以自增。

                  b是数组名,  数组名是地址, 但此时是作为常量,不可作为左值,不可以自增; 数组名是地址 它不是变量 数组才是变量

    int b[]={10,20,30,40,50};
    int i, *k;
    k=&b[4]-4;
    for (i=0; i<=4; i++)
    {
      cout << *k << " "; //依次输出每一个数组元素
      k++; //k 是变量, 它存得是地址, 变量可以作为左值,可以自增。
    }
    cout<<endl;

    cout<<"b = "<<b+1<<endl; //输出的是第一个元素地址
    cout<<"&b[0] = "<<&b[0] + 1<<endl;
    cout<<"b = "<<b++<<endl; //数组名表示得是地址 不能做为左值 , b++ 表示的是b=b+1
    cout<<"&b[0] = "<<&b[0]++<<endl; // &优先级高于++, 同(&b[0])++, 也是地址自增,但此时地址是常量,而不是变量,同上,编译出错

    比如说 int a[5],b[3]={1,2}; 你只会 a[1]=b[1]; 这样 。 应该不会a=b把。

    数组名不是变量 不能做左值

    指针你可以把它看做一个整型(但不是)数据类型 它是一个变量 存储得是一个地址 比如你可以把一个地址赋值给它,这时指针变量就存储这个地址,再把另一个地址赋值给它, 这时指针变量就存另一个地址,它是可以变的,所以可以作为左值。

    数组,你声明一个数组,系统就分配了一个内存单元 这时数组名表示得是这个数组首元素得地址,这个地址是不能变得,可以把它看做(但不是)常量,所以不能作为左值 。

    从编译器角度分析C语言中数组名和指针的区别       

            分类:            C语言学习181人阅读评论(1)收藏举报

    数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码:


    1. int *p;
    2. p++;

    却不能写这样的代码:


    1. int a[];
    2. a++;

    那么数组名跟指针之间到底有什么区别呢?

    第一,在声明上,除了作为函数参数的数组名总是编译器转化成指针其他情况下,数组名就是数组名,指针就是指针,二者不能混淆你不能在一个文件中定义一个数组,而在另一个文件中把它声明成一个指针


    1. char a[]; //定义一个数组a

    2. extern char *a; //在另一个文件中将a声明成一个指针

    在编译器中,符号表用来存放C语言中有关标识符的属性信息,这些信息集中反应了标识符的特征属性。等到词法分析到代码声称的各个阶段的时候,编译器需要根据源代码提出的要求,从表中获取不同标识符的不同属性。值得注意的是,数组标识符的属性和指针是完全不同的。因此,在一个文件中定义一个数组的时候,编译器会把它记录在符号表中,而在编译器分析另一个文件中的声明时,通过符号的语义检查发现不一致。也许这样的声明可以编译通过(在gcc下通过了),但是把一个数组名当成一个指针来使用,别指望它能运行起来。

    第二指针是一个变量,而数组名不是。数组名是数组的首地址,即它本身就是一个地址,对应到汇编语言级别就是一个常量,一个固定的数(地址)。因此数组名不能进行++,–等运算。

    在大多数编译器中,对数组的引用a[i]总是被编译器改写成*(a+i)的格式。也就是说,编译器每遇到a[i],都会把它当作*(a+i)来处理。我们都知道,*addr表示内存中(addr)的位置存储的值,比如*0×8048000就表示地址为0×8048000的内存中所存储的值。所以a[i]就表示a的值加上i所得到的数作为一个内存地址里面所存储的值。

    那么a的值是什么呢?编译器在做词法分析和语法分析的时候,遇到一个数组的定义,就会把数组的有关信息汇集在一个叫做“内情向量”或“信息向量”的表各种,其中的信息包括数组的类型,维数,各维的上、下边界,以及数组的首地址,然后将这个“内情向量”相关信息存储在符号表中。数组定义后位置就是固定的,因此其首地址可以在编译阶段得到。当编译器到达代码生成的各阶段时,每次遇到数组名这个标识符,编译器都会从符号表中取出这个数组的首地址,然后用这个地址来替代数组名,例如,假设数组a起始地址是0×8048000,则a[1]就会被编译器转化成*(0×8048000+1),因此在生成的汇编代码中,数组名已经完全被转化成一个常量,一个固定的数(地址)。

    但是,对于指针p,它是一个变量,其值存储在地址&p中,这个值在编译时是不能得到的。因为是变量,所以指针可以作为表达式中的左值操作,如++或--,而被认为是常量的数组名却不可以,正如你可以骑走一辆自行车,但是不能骑走一棵树。另外,C语言把数组下标改写成指针偏移量的根本原因是指针和偏移量是底层硬件所使用的基本模型。


    第三,对数组的引用,如a[i],或*(a+1),需要访存一次;而对指针的引用,如*(p+1),需要访存两次。

    如果理解了第二条的解释,这个应该就不难理解。因为a被认为是常数,所以取*(a+1)的值只需将a所表示的常数加1,然后从得到的地址里访存取一次即可。而对于指针,需要先从&p这个地址里把p的值取出来,然后加1,再从得到的地址里访存取一次,一共需要两次访存。

    第四,假设a是一个数组名,而p是一个指针,当你使用 a 和 &a 时,得到值是一样的,都是数组的起始地址。而使用 p 和 &p 时,得到的值是不一样的, p 表示指针 p 所指向的地址,而 &p 表示 p 这个变量的地址。再假设


    1. p = a;

    则 p 就表示数组a的起始地址,而&p是存储数组a的起始地址的那个地址。这是因为编译器把a当成数组首地址,而&a当作数组第一个元素的地址,因此得到的值是一样的。

    另外,sizeof(a)得到的是a所表示的数组的大小,而sizeof(p)得到的是指针的大小


    转自:http://www.diybl.com/course/3_program/c/c_js/20111003/561447.html

    www.diybl.com    时间 : 2011-10-03  作者:网络   编辑:hawk


    数组名和指针变量都不可做++或--运算吗? 

    检举|2012-03-30 10:48雨明yzs| 分类:C/C++| 浏览97次

    下载知道APP,提问优先解答!

    方式一:扫描二维码下载

    建议:可使用微信的“扫一扫”功能扫描下载

    方式二:短信免费下载

    下载链接将通过短信免费下发到您的手机

    发送短信

     

    检举| 2012-03-30 10:57 提问者采纳
    数组名不可以,指针可以。这就是指针和数组的区别。

     

    展开全文
  • 数组名不能进行自增等操作来使数组名指向别的元素,但传参或再定义一个指针后可以 #include<stdio.h> int test(int *arr); int main(void) { int i = 0; int arr[10] = { 0 }; int *parr = arr; parr += 3...

    数组名不能进行自增等操作来使数组名指向别的元素,但传参或再定义一个指针后可以

    #include<stdio.h>
    int test(int *arr);
    int main(void)
    {
    	int i = 0;
    	int arr[10] = { 0 };
    	int *parr = arr;
    	parr += 3;
    	for (i = 0; i < 10; i++)//直接在定义数组的语句块内部对数组名进行赋值是不合法的,这个数组名虽然是首元素地址但不能被改动
    	{
    		*(arr + i) = i;//但是如果写一个int *parr=arr;,那么就可以改动parr让他指向不同元素,同理通过函数传参把arr传过去完全退化成一个指针也可以
    	}
    	//arr += 3;
    	printf("%d\n", *parr);
    	test(arr);
    	printf("%d\n", *arr);
    	return 0;
    }
    int test(int *arr)
    {
    	arr += 3;
    	printf("%d\n", *arr);
    	return 0;
    }
    

    大体就是这样,直接对数组名进行+=运算是不行的,编译报错为左值表达式不可修改,但使用parr或函数传参后即可正常运算,运行结果为:
    在这里插入图片描述

    展开全文
  • 数组名是元素首地址,所以一般都会认为: int a = {1,2,3,4}; for (int i=0;i<4;i++,a++)printf(“%d”,*a);//报错a++不允许加减操作 为了让C编译器知道我们想让a自增或加减,就得让C编译器知道这是指针类型的...
  • 数组

    2020-08-20 23:56:38
    数组地址不是个变量,不能赋值,不能进行自增自减运算。 二维数组的前一个括号可以省去。
  • 但是这时就出现了问题,数组名竟然不指向首地址元素了,事后想想也知道如果一直指向首元素那么显然不能通过这种自增数组名的方式遍历数组 在main函数定义数组并使用数组自增时,编译器会报错,那为什么在while循环...
  • 《算法笔记》2.5数组

    2019-07-04 21:28:12
    《算法笔记》学习记录004一、今日学习概览p39~47备注:二、今日代码分析2.23 冒泡排序2.24 三维数组自增12.25 memset函数 一、今日学习概览 p39~47 数组从某个地址开始连续若干个位置元素集合下标 2.5数组2.5.1...
  • 指针和数组

    2021-03-06 20:39:41
    指针和数组: char* str ="abcdef"; 不可修改 char ch[] ="abcdef"; 可修改 char* s ; s+2; //指针移动2位 ...二维数组名加1,是移动... 数组名 a+1 是加了1组(行),是第二组首地址 *p++和*(p++)等价,是自增p。要自增p
  • 指针的概念以及一维指针和一维数组相关的知识,我这里就不具体讲了,本文主要讲解字符指针和字符数组、多级指针和多级数组这些比较容易混淆的知识点。 指针运算 赋值运算 指针变量可以互相赋值,也可以赋值某个...
  • 了解数组的概念

    2019-09-25 08:06:55
    数组是一组相同类型的对象的集合,这些对象有一定的顺序,在...数组名是一个常量,是数组元素集合在内存存储的首地址,不能进行自增自减运算。 数组每一维的下标下界是0,上界是该下标所在维的元素个数减1。 多...
  • JavaScript 数组去重

    2021-01-10 02:39:09
    // 则 i 自增进入下一个循环比较 if (a[i] === a[j]) j = ++i; } res.push(a[i]); } return res; } var a = [1, 1, '1', '2', 1]; var ans = unique(a)...
  • C语言再学习——数组

    2015-06-02 13:15:00
    1.数组名:地址常量(不能自增,赋值等操作); 2.数组中的元素指的都是变量。可以被赋值。 3.数组长度:数组中元素的个数。 4.数据类型:决定了每一个数组元素占用的内存空间大小。 5.数组占用内存空间...
  • 数组名是一个常量,代表数组元素集合在内存存储的起始地址,不能进行自增或自减运算。   2、数组的使用 需要注意的几点: 如int a[A][B]  A、B为下标表达式,必须是正整数。 A、B可以是任何表达式,但...
  • 数组名a是一个指针常量(不能改变指向的地址),也就不能进行自增或自减等运算。a和&a[0]是等价的。所以用数组名结合简单的算术运算符就可以访问数组元素。如: *a; //第一个元素 *(a+1); //第二个元素,即i+1个...
  • 指针与数组的区别

    2017-10-27 21:56:45
    指针:一个变量的地址称为该变量的“指针 ”。 区别:1.把数组作为参数传递时,会退化为指针。 数组名作为函数形参时,在函数体内,仅仅只是一个指针;在失去其内涵的同时,还失去了其常量特性,可以做自增、自减...
  • 优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右– ()圆括号(表达式)/函数名(形参表)– .成员选择(对象)对象.成员名– ->成员选择(指针)对象指针->成员名–2-负号运算符-...
  • 嵌入式指针与数组:一维数组:二维数组:行指针:指针数组:二级指针:{const型指针:void 指针函数:... 数组名约等于指针,除了自增自减和赋值(数组名本质是地址常量,指针本质是地址变量) p++ ++p --p p++ p =
  • C++中对数组名的运算

    千次阅读 2018-04-28 16:45:39
    数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。1 一维数组以下代码定义了一个有4个元素的int数组int b[] = {1, 2, 3, 4};1.1 与数组名相关的运算对数组b的运算,例如b、&...
  • 在通常的认识里我们认为一维数组名代表数组的首地址,当然我们更习惯用一个指针来指向一个一维数组,这样做的好处是由于指针是变量可以通过自增自减等操作来完成数组元素的遍历,但是数组名也可以完成这种功能,不同...
  • 数组与指针

    2017-04-25 18:09:00
    合法的指针运算有:指针与整数的加减(包括指针的自增和自减)、同类型的两指针相减、同类型指针间的比較。 【指针与整数的加减】 指针加上一个整数的结果是还有一个指针。由于指针就是地址,所以,指针加上...
  • #include <stdio.h> #include <stdlib.h> int main(void){ int age[] = {1, 2, 3, 4}; int p = sizeof(age)/sizeof(age[0]);... //打印数组地址 和第一个成员地址 printf("数组地址:0x%.
  • 数组有所不同,vector可以对容量进行自增 二.自增规则 开辟一块原内存大小1.5倍(或2倍)的新内存(不一定是相邻地址),并将原数据拷贝到新内存中,释放原内存。而不是在原内存基础上顺序增加新内存。 用以下...
  • java基础 数组元素内容颠倒 public static void main... //初始化两个值进行自增和自减,判断i<=y时结束循环 for(int i=0,y=array01.length-1;i<=y;i++,y--) { //sum指向//array01[i]地址值 sum=arra
  • 指针变量与指针常量的不同之处是,前者可以使用自增运算符++或者自减运算符--来进行自加和自减,但是指针常量不行因为指针常量是常量所占内存区域中的值不允许修改,自增和自减都是在本地址空间内进行的。
  • 数组与指针的区别

    2012-08-31 11:08:55
    int a[100];char a[10]; char *b="ABCD"; a是数组,包含的信息不一样,它包含它所在的内存地址,还有长度, ...因为a是一个数组,所以也不像指针一样,可以自增自减,像++a,a--是错误的,但 a+1,a-1是可以编译通过的.
  • 数组名作为函数参数时,退化为指针 ...Func ( char str[100] )函数中数组名作为...数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。在C++里参数传递数组永远都是传递指向数组首元素的指
  • 指针变量的自增和变量的自增自减还是有很大的差别的。 指针增一就是内存地址进入下一位,而且根据指针变量的类型不同而不同。...对于指针的自增自减,用数组的例子可能会更好理解,所以下面我用数组的例子来...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

数组地址自增