对于C语言中数组名是指针的理解

我们都知道,c语言中数组名是一个指针,比如下面这段代码

#include<iostream>
using namespace std;
int main()
{
 int a[4]={1,2,3,4};
 for(int i=0;i<4;i++)
 {
  cout<<*(a+i);//*(a+i)和a[i]是等价的。
  cout<<endl;
 }
 return 0;
}

但是看下面这个代码

#include<iostream>
using namespace std;
int main()
{
 int a[4]={1,2,3,4};
 cout<<"数组长度"<<sizeof(a)<<endl;
 int *p;
 cout<<"整形指针的长度为:"<<sizeof(p)<<endl;
 p=a;
 cout<<"指向整形数组后指针的长度为:"<<sizeof(p)<<endl;
 return 0;
}

运行结果为:数组的长度为16

整形指针的长度为:4

指向整形数组后指针的长度为:4

*********************************

问题来了:既然数组名a是指针,为什么sizeof(a)和sizeof(p)得到的结果是不一样的呢?是不是说数组名不仅仅是指针呢?

我是这样理解的,数组名就是指针,而且是个常指针,而sizeof一个长指针和一个同类型的指针变量得到的结果是不一样的。

时间: 2024-10-26 05:06:22

对于C语言中数组名是指针的理解的相关文章

c语言中数组名和指针变量的区别

编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间.但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的起始地址. 结论1:由于计算机没有为数组变量分配空间,也就不能把它指向其他地方.例题: char s[]="How big is it?"; char *t=s; //正确,将数组的地址赋给指针变量t s=t; //错误,数组变量没有存储空间,无法存储指针变量t的值,编译报错

c语言中数组名的本质

c语言中的数组名的本质是什么,数组名是指针吗? 1.数组名是数组元素的首地址#include <stdlib.h>#include <stdio.h>void main() { int a[10] = {1, 2, 3, 4, 5, 6, 7, 8,9, 10}; printf("a:%d &a:%d :%d \n", a, &a); system("pause"); }上面的程序中,a &a大小一样,证明a就是数组元

C语言,数组名,指针常量和常量指针

自己给自己劝退一波~ 先介绍指针常量和常量指针 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

二维数组中数组名与其指针的关系

大多数初学者不是很清楚二维数组是个怎样的存在,今天我就来说说这个二维数组,计算机内存是一连串的存储单元,我们可以把它理解成一条线,没错就是一条线,那么问题来了,二维是个怎样的存在呢???说白了,二维数组并不真是二维,只是人们主观的将它变成二维,举个例子吧!比如楼梯,我们都知道楼梯说白了就是一条路,但是我们刻意将楼梯来回上升的方式,这都是我们主观的改变,实际上我们可以看成是一个直路,只是被工人弄弯了.好了,不扯了,进入主题.... 二维数组名a是数组第一行的指针,它指向的是一整行,*a才是a[0]

Go语言中地址传递及指针的理解

在学习指针时遇到一个问题,在网上贴出后,得到很多前辈的指导和耐心解答,在此表示感谢,因此整理了此篇文章. 第一次实验,代码如下: type Student struct { Name string } func remove(stu *Student) { fmt.Printf("2----%v\n", stu) stu = nil fmt.Printf("3----%v\n", stu) } func main() { stu := &Student{&q

C 语言中的左值和右值。以及对比数组名和指针取数组元素的区别。

左值:出现在赋值符左边的符号有时称为左值. 右值:出现在赋值符右边的符号有时称为右值. 编译器为每个变量分配一个地址(左值),这个地址在编译时可知,而且该变量在运行时一直保存于这个地址.相反,存储于变量中的值(它的右值)只有在运行时才可知.如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器. 可以看到,每个符号的地址在编译时可知. 对比一下几个式子: //常规变量 int a=1;//这里a作为左值出现,代表的是地址,即在a表示的这个内存地址存入数值1.即a代表的内

c语言中数组,指针数组,数组指针,二维数组指针

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *

C语言 对数组名取地址

作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是

c/c++数组名和指针区别深入探索

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,