精华内容
下载资源
问答
  • 先介绍指针常量和常量指针 const int *p; //这是个指针常量 int const* p; //这是个常量指针  const是常量修饰符,被修饰的就是个常量,常量的特性就是不能改变。 先介绍指针常量, const int *p; ...

    先介绍指针常量和常量指针

    const  int *p;   //这是个指针常量
    
    int const* p;  //这是个常量指针 

    const是常量修饰符,被修饰的就是一个常量,常量的特性就是不能改变。

    先介绍指针常量,

    const int *p;   
    int   i=2;   
    p=&i;
    

     这里*p就是一个常量,他的值不能改变,也就是不能再通过*p=1; 这样赋值而去改变 i 的值,但可以通过直接i=1;这样改变i的值,此时*p的值也相应变为了1

    int const* p=NULL;
    int i=1;
    p=&i;

    常量指针顾名思义,可以认为指针是常量,常量指针只能被赋值一次,指针的值不能改变后面再进行赋值会报错,不过第一次赋值NULL,让它成为空指针是允许的,因为空指针很特殊。*p的值可以改变

    这里有个值得注意的地方

    #include <stdio.h>
    int main()
    {
    	const int i=10;
    	int *p;
    	p=(int *)&i;
    	*p=100;
    	printf("%d\n",i);
    	return 0;
    }
    

    这段程序,在某些编译器里是可以改变 i 的值的,而某些不能。。。看情况吧,不过在c++里是肯定不允许改变的,应该会直接报错

    前面介绍指针常量和常量指针是为了介绍下面的数组名,从这篇文章中得到的思考  https://zhuanlan.zhihu.com/p/24799071?iam=83d196fe2b966cf160601b3be0de2003&utm_source=com.tencent.tim&utm_medium=social

    ...其实这个我还是不是很懂,它的意思就是数组名不是指针常量,因为数组的官方定义里没有const修饰,我给出自己的理解

    如果数组名是指针常量,那么为什么不可以进行++,--操作?

    数组本身就是一种类型,所以数组名不是指针

    而进行取内容运算时,数组名就会隐式转换为指针      //隐式转换,像char  str=97;而%c输出str,得到的是a,这样子

    二维数组递推,实际上就是元素类型是数组的数组  //有点绕,但思维就这样的,看个人的逻辑思维理解能力,反正我是不太懂(ノ ̄д ̄)ノ

    关于指针的左值和右值是什么,这里就简单说下

    int a = 10,b;
    int *d ;
    d = &a; //d位于左边,表示的是存储d这个指针变量本身的内存地址。
    b = *d; //d位于右边,表示的是d 表示的是存储变量a的内存地址。*d就是得到了a内存地址里a的值
    

      

     

    转载于:https://www.cnblogs.com/GH-D/p/8290351.html

    展开全文
  • 例如:int (*a)[3]就是指向个指向二维数组指针指针数组就是数组的内容为指针 例如:char *a[2],那么a[0]和a[1]都是指向char类型的指针。当我们录入2个字符 串的时候,我们就可以使用指针数组。 #include <...

    指针数组、数组指针和二维数组

    多维数组本身是指针数组,多维数组首先是数组,数组的内容是子数组的指针数组的数组指针

    数组指针就是指向数组的指针,所以在使用多维数组时候使用

    例如:int (*a)[3]就是指向一个指向二维数组的指针。

    指针数组就是数组的内容为指针

    例如:char *a[2],那么a[0]和a[1]都是指向char类型的指针。当我们录入2个字符

    串的时候,我们就可以使用指针数组。

    #include <stdio.h>
    void main()
    {
        int num[3][3] = {0 ,1, 2, 3, 4, 5, 6, 7, 8};
        int *p[3];
        p[0] = *(num+1);
        printf("p[1][2] = %d\n", *(p[0]+2));
    }
    
    #include <stdio.h>
    void main()
     {
        int num[3][3] = {0 ,1, 2, 3, 4, 5, 6, 7, 8};
        int (*p)[3] = num;
        printf("p[1][2] = %d\n", *(*(p+1)+2));
    }
    

    常量指针和指针常量

    const为只读概念,编译器操作。
    区分与const,int顺序无关。和const ,*顺序有关。没有理解时可读出记忆。

    常量指针

    const int *ptr
    int const *ptr
    

    指针常量

     int * const ptr
    

    对于常量指针(常量的指针,值不变,地址可变)、指针常量(地址不变,内容可变)

    展开全文
  • 我们知道一维数组名是常量指针,我们可以将一维数组名赋给一个指针类型再对一维数组进行相关的操作,那二维数组名又是什么?我们这样初始化一个二维数组int A[3][3]={1,2,3,4,5,6,7,8}或者为int A[3][3]={ {1,2,3},{...

    我们知道一维数组名是常量指针,我们可以将一维数组名赋给一个指针类型再对一维数组进行相关的操作,那二维数组名又是什么? 
    我们这样初始化一个二维数组int A[3][3]={1,2,3,4,5,6,7,8}或者为int A[3][3]={ {1,2,3},{4,5,6},{7,8,9}};从后面一个定义我们可以看出二维数组是由两个一维数组组成的也就是说二维数组是“数组的数组”。 
    问题 
    了解了二维数组那么二维数组名又是什么呢,是不是和一维数组名一样是个一维指针呢?看下面代码:

    1 #include<stdio.h>
    2  void main()
    3  { int i,j;
    4    int A[3][3]={{0,1,2},{3,4,5},{6,7,8}};
    5    printf("%x\n",A);
    6    printf("%x\n",*A);
    7    printf("%d\n",**A);
    8 
    9  }

    从代码的结果可以看出只有**A才能输出数组中的元素,*A输出的是一个地址,那么我们是不是可以吧二维数组名理解为指针的指针。然后定义一个指针的指针 int **p,将数组名赋给p然后二维数组进行相关操作呢?答案是否定的,看下面代码: 
    代码1

    1 #include<stdio.h>
    2  void main()
    3  { int i,j;
    4    int A[3][3]={{0,1,2},{3,4,5},{6,7,8}};
    5    int **p;
    6    p=A;
    7    printf("%d",**p);
    8 
    9  }

    但是这个代码编译不过,显示error为“无法从int[3][3]转化为int **,那就说明了二维数组名不是指针的指针。那二维数组名又是什么呢?看代码: 
    代码2

     1 #include<stdio.h>
     2  void main()
     3  { int i,j;
     4    int A[3][3]={{0,1,2},{3,4,5},{6,7,8}};
     5    int (*p)[3];
     6    p=A;
     7    for(i=0;i<3;i++)
     8   { for(j=0;j<3;j++)
     9     printf("%2d",*(*(p+i)+j));
    10     printf("\n");
    11      }
    12 
    13  }

    从这个结果我们可以看出我们可以先定义一个数组指针int (*p)[3],然后将A数组名然后进行相关操作,即二维数组名是一个数组指针,然后对P+1指向的是下一个数组即下一行的地址进行操作。 
    原因 
    二维数组名即数组地址,指向首行地址,不是指针的指针。表面上看,行地址即一维数组指针,而数组名指向行搜索就应该是指针的指针。 但是你考虑过没有,如果A[3][3],假设int**p=A; 那么要对行递增执行p++时,编译器如何知道列宽?因为int**是指指向一个 int 类型的指针,其数据宽度是4字节,内置宽度,因此p将指向下一个整数元素地址,也就是p递增了4字节,而不是3个int型数据的宽度,这就错位了。 所以A[3][3]的地址类型不是简单的指针的指针,而是行指针的指针,而行宽是由你定义的数组列数和元素类型所决定,int类型就是4*3=12个字节。这叫数据对齐。因此编译器在转换数组名时,会根据对齐要求而确定相应的指针类型,所以A的地址类型应该是int ()[3],而不是int **。 所以应该这样int (*p)[3]=A; 其含义为,p是一个指向(含3个int类型元素的一维数组或行的)指针,其实本质上任何指针都是4字节(32位系统),你完全可以将一种指针类型强制转为任何其他类型,那为什么还要区分指针类型,就是为了指针运算时实现数据对齐,准确定位。

    转自:http://m.blog.csdn.net/toyalll/article/details/50043193

    转载于:https://www.cnblogs.com/CZT-TS/p/7654901.html

    展开全文
  • 数组名是指针常量

    2015-08-07 15:51:31
    今天来说说数组名,经过查资料和自己的理解,发现数组名就是指针常量。 不废话,先上程序: #include int main() { int a[3]={1,2,3}; int (*b)[3]=&a; printf("a的值是%d,a[0]的值是%d,a的地址是%d\n",a,a[0...

    今天来说说数组名,经过查资料和自己的理解,发现数组名就是指针常量。

    不废话,先上程序:

    #include<stdio.h>
    int main()
    {
    	int a[3]={1,2,3};
    	int (*b)[3]=&a;
    	printf("a的值是%d,a[0]的值是%d,a的地址是%d\n",a,a[0],&a);
    	printf("b的地址是%d,b的值是%d,*b的值是%d,**b的值是%d\n",&b,b,*b,**b);
    	return 0;
    }

    运行结果:



    在这个程序中我使用了一个数组指针指向了一个一维数组,我们发现不仅a的值与a的地址(即&a)是一个值,而且数组指针b中存放的值也和*b是一样的。

    这个时候疑问就来了,b是地址的话,那么*b不就是取b地址里的内容么,为何*b不与a[0]的值相同呢?

    原来,我们的数组名a是一个指针常量,如果我们想通过指针b来取a数组中的元素的话,就相当于要通过于一个二级指针,这时要加两个*号啦,

    所以**b的值才与a[0]相同。

    展开全文
  • 数组名是一指针常量吗?

    千次阅读 2014-11-22 13:31:47
    数组名是一指针常量这种观点来源于数组名在表达式计算中与指针的结果等效性。例如下面的代码:   int a[10], *p = a, *q; q = a + 1; q = p + 1;   在效果上看,a + 1与 p + 1是相同的,这很容易给人种...
  • 1.一维数组的地址 在C语言中,数组名是个不占内存的地址常量,它代表整个数组的存储首地址。 一维数组元素a[i]的地址可以写成表达式&a[i]或a+i,&a[i]是用下标形式表示的地址,a+i是用指针形式表示的地址,...
  • 数组名是指针常量,即指针的指向不可以修改,但指针所指向空间的值可以修改 一维数组数组名除了两种特殊情况外,可以理解为指向第一个元素的指针 两种特殊情况: sizeof数组名 对数组名取地址 int arr[5] = { 1,...
  • 1.一维数组的指针表示 int a[10]; int *p; p=&a[0]; 注意 数组a其实是个指针常量,一次不可赋值 p=a; 和p=&a[0];是等价的,指针默认指向数组元素的首地址 可写成 int a[10]; int *p=a; 数组元素可以...
  • 一维数组&指针

    2019-08-24 10:08:50
    导言:对于一维数组而言,数组作形参↔指针变量作形参,都可以用下标法和指针法来引用数组元素。 1、数组作形参​
  • 指向具有M个元素的一维数组指针 定义格式如下: 类型 (*指针变量)[M]; //M为一整型常量 通常利用该指针变量,指向二维数组的行地址,其中M表示二维数组的列数。 例如:利用行指针变量,按行输出二维数组各元素值 ...
  • 1)一维数组名字本身就是一个指针,是一个指针常量,即一维数组a等价于int * const a。 2)二维数组名是指向一维数组的指针。例如有个二维数组a[i][j],a是指向原来数组的第一行的指针,a+1就是指向第二行的指针...
  • 维数组与指针、指针数组、数组指针的用法

    万次阅读 多人点赞 2018-03-12 18:16:20
    二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要...而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组下面我们讨论指针和二维数组元素的...
  • 指针一维数组

    千次阅读 2018-07-28 15:15:12
    数组名本身就是指针(地址),它代表了数组的首地址,数组在内存中连续存放 对于数组a,a的值与&amp;a[0]相等 int a[] = { 1,2,3,4,5 }; int *p = a; printf("%p %p %p\n", a, &amp;a...
  • 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到个关键字const const是个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定个变量不允许被改变,...
  • 维数组名和二级指针

    千次阅读 2018-01-26 22:28:00
    1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问块连续的内存空间(大小由指针所指向的数据类型决定),将这块空间的内容转换成相应的数据类型,并返回左值。...
  • 一维数组名是指针常量 它存放的是一维数组第一个元素的地址 */ # include <stdio.h> int main(void) { int a[5]; int b[5]; //a = b; //error a是常量 printf("%#X\n", &a[0]); printf("%#X\...
  • 一维数组指针: 1、一维数组名: 对于这样的一维数组:int a[4]; a作为数组就是我们数组的首地址, a是一个地址常量 .  首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一...
  • 一、一维数组的定义与初始化 1.一维数组的定义 一维数组也称向量,它用以组织具有一维顺序关系的一组同类型的数据。 一维数组的定义方式: 数据类型 数组[常量表达式] 类型说明符表示数组中所有元素的类型;...
  • 维数组和二维数组名

    千次阅读 2018-06-26 05:50:40
      对于一位数组我们认识到其数据元素在内存中是按线性顺序依次排列的,且一维数组名的值是一个指针常量。那么二维数组在内存中又是怎么存储的,其数组又有什么含义呢?   定义一个二维数组: int arr   ...
  • C语言一维数组名究竟是什么

    千次阅读 2019-12-04 23:24:42
    按照我一贯的理解, 一维数组名==首元素地址==常量,理解马马虎虎,日常使用并没有什么问题 直到有一天我在思考一个左值右值的问题时,发现了数组名的不同 问题:既然数组名是常量,我们都知道常量不能当左值,所以...
  • 一维数组指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5]; a作为数组就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再...
  • 1.一维数组名与二维数组的关系之于普通指针与数组指针的关系 2.首先数组编译器会隐式变换看做指针常量,因此a[i]与a+i是等价的。 a+i返回由i指定的行地址,假设元素类型为char,则行指针类型为char ()[n],...
  • 这篇是篇C语言劝退流教学文,看不懂的同学应该是劝退教学流的目标对象 (写完了才想起来注一下,...首先,数组名不是常量指针,从两方面: 1. 类型方面,数组的类型是type[size],和常量指针类型type* const不同
  • 一维数组名的含义

    2021-03-16 23:46:15
    一维数组名的含义 ...数组名是指针常量(int * const),指针的指向不可以修改,指针指向的值可以修改 #include <stdio.h> // int arr[] 等价于 int *arr // int arr[] 的可读性更好 void printfArr(int
  • 新手必知之c语言一维数组指针

    千次阅读 2019-01-26 12:41:56
    一、简述一维数组指针 (1)在C语言中,数组是占用一串连续的存储单元。数组中每个元素都可以看作一个变量,因此每个数组元素都有一个地址。 那么:int *p,a[5]={1,2,3,4,5}; 指针p的基类型是int,数组a的各个...
  • 一维数组 定义一个数组:int a[5]; 此处,a,&amp;a[0]以及&amp;a做右值时在数值上是完全相同的,但含义不同。 数组a只能做右值,不能做左值。做右值是表示数组首元素首的地址,同&amp;a[0],如: ...
  • 指针一维数组

    2021-10-27 20:42:54
    一维数组名是一个指针常量,存放数组第一个元素的地址。 常量的值无法改变。 int a[5]; int b[5]; a = b; //error 常量之间无法赋值 printf("%#x\n", &a[0]); //%#x输出十六进制的数据 printf("%#x\n", ...
  • 指针一维数组 指针移动方式访问数组元素: int a[5], *p; // a存放了数组的首地址 p=a; // 数组首地址赋给p p++; // 向下移动4个字节 指针与数组名都是地址,因此可以混合使用访问数组元素。...
  • 一维指针一维数组

    2020-12-21 12:57:06
    C语言的一级指针一维数组 数组: 相同数据类型的数据集合。 数组利用其下标变化实行对内存中的数组元素进行处理。 int a[10]; int *pa; pa=a,或pa=&a[0]; 指针pa加上或减去整数i,通过i的变化就可以和数组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,573
精华内容 13,029
关键字:

一维数组名是指针常量