c语言学习零碎整理(7):数组名是指针吗?

c语言*零碎知识便签 这篇博客是写一写c语言学习过程中的一些零碎的知识,不定时更新!一部分原创,一部分转自一些博客,或者是摘抄书本上的讲解~,c语言知识本来就比较零碎,感觉就是捡漏一样。 1 引脚,又叫管脚,英文叫 Pin。就是从集成电路(芯片)内部电路引出与外围电路的接线,所有的引脚就构成了这块芯片的接口。引线末端的一段,通过软钎焊使这一段与印制板上的焊盘共同形成焊点。我们电脑的触摸鼠标就是运用了引脚。 2 ... 阅读详情

今天在csdn的c版看到了这样的一个帖子:http://community.youkuaiyun.com/Expert/topic/4264/4264741.xml?temp=.8964502 问的是数组和指针的区别.但最后引出的却是"数组名是指针吗?"这样一个问题.

其中megaboy(飞天御剑流之杀神一刀斩) 的回答与众不同,按他对数组名的理解:数组名是一个符号地址常量,这个解释确实可以解释一些现象,但还有很多不能用这个来解释的问题.

比如我在那个帖子里提到的两个程序:

1,include<stdio.h>
main()
{
int a[]={1,2,3};
int *p;
p=a;
printf("%d/n",p);
return 0;
}一个符号地址常量怎么可以对一个指针赋值呢?

2,又比如,printf的参数要求是一个指针,按megaboy的说法下面的程序肯定不成立.

#include<stdio.h>
main()
{
char a[]="wayne";
printf(a);
return 0;
}但结果是打印出wayne

晚上迎接新生回来以后,查了一下<<c++ primer 第三版>>和<<c++程序设计语言 特别版>>.前一本书上没有提太多这方面的东西,在7.9.2节只有一句话提到:"不带下标操作符的数组名会被解释成指向首元素的指针".后一本讲的多一点,在5.3节:"到数组的指针"中把这个问题大致讲了一下:"一个数组的名字能够被用作到它的开始元素的指针.
如 int v[]={1,2,3,4};
int *p1=v;//指向开始元素(隐式转换)  隐式地从int [ ] 转换到int *
从数组名到这个数组的开始元素的指针的隐式转换,在c风格代码的函数调用中广泛使用."      

至于到底是怎么转换地,我想没有必要了解的那么多.          

所以我还是认为"不带下标操作符的数组名会被解释成指向首元素的指针".这样好理解.但是数组名是不能被修改的,它是一个常量,不能进行任何赋值或加减的运算.

 2005.11.26 更正:
今天又认真地看了一遍K&C中关于指针和数组的章节,感到自己以前的理解是有偏差的。
我现在的理解是:
1。数组名所代表的是该数组最开始的一个元素的地址。
2。指针是一种保存变量地址的变量。
3。数组名和指针之间有一个不同之处。指针是一个变量,因此,在C语言中,语句pa=a和pa++都是合法的。但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的。
以上均抄自K&C。以前看书太不仔细了。如果从汇编的角度看的话应该更容易理解一些。
至于<<c++程序设计语言 特别版>>中提到的隐式转换,应该是把数组第一个元素的地址送到指针所在的内存空间中,即指针的值为这个地址。
同时我觉得简单地理解为"不带下标操作符的数组名会
被解释成指向首元素的指针"也没有什么错误。但要注意,数组名绝对不是指针。

2005.12.10 补充:

在一个blog上看到一篇文章,也是讨论数组名的(http://blog.youkuaiyun.com/soloist/archive/2004/11/03/164625.aspx),

觉得写得不错,所以写一下自己现在对这篇文章的一些认识,就算是对自己写的东西的一个补充吧。现在看自己前面写的,觉得以前的理解确实比较浅薄。学无止境啊,学习ing!

下面引用一下soloist的文章(加粗的是我自己的一些试验和理解):

C/C++中的数组名是个很奇怪的东西,它到底代表什么呢? 

对于char array[n](n是一个常数),大概有这么几种语义:

<1> char* const(注意不是const char*)   <2> char [n]

举例如下(WIN2000 PRO平台,VC.NET 7.1下编译):

<1>  char p = array; //array表示char const,p得到的是数组的首地址

size_t size = sizeof(char [n]); // size等于n

/**********sizeof(char [n])就相当于sizeof(array)*********/

<2>     char (*p)[n] = &array; // array表示char [n],

// p得到的仍然是数组的首地址

char (*q)[n] = array;  // 编译错误  

/**********因为q的类型是char (*)[n],而array的类型是char*  ************/

char (*r)[n] = (char (*)[n])array; // r得到的是array数组的首地址

/*********************我的试验和理解********************************

#include<stdio.h>

enum{n=12};

main()

{

char array[n];

char (*p)[n] = &array;//这里,&array[0]等价于&array

printf(“%d/n%d/n”,sizeof(*p),sizeof(p)); //结果为12,4

return 0;

}

语句char (*p)[n] = &array;声明了p一个指向字符数组的指针,这个数组的大小和array一样。所以sizeof(*p)和sizeof(array)的值相等。注意:在这个程序中,数组array和*p都只是被声明,并没有被分配内存。

我又试了一下,发现sizeof(array)和sizeof( *(&array) )相等。这就可以更好地理解上面的程序了。上面的程序和sizeof( *(&array) )相比,只是多了一个变量p罢了。p的地址为&array,那么*p就是array了。所以sizeof(*p)就和sizeof(array)的值相等了。

<3> char (&p)[n] = array;  // array表示char [n]

这个语句当时让我有些迷惑,后来在别人的指点下,才明白&在这里原来是c++中的引用(c++学的不多,放在这里就更让我不懂了)。在c中编译不能通过。这个语句声明p是数组array的一个引用。所以sizeof(p)=n.

那篇文章还讨论了不少,但基本上都是以前面的为基础。

 

FPGA以太网接口设计避坑指南:GMII与RGMII时序转换的三种实现方案对比 本文深入解析FPGA以太网接口设计中GMII与RGMII时序转换的三种实现方案,包括Xilinx官方IP核、手工原语逻辑和开源方案gmii_to_rgmii。通过对比分析各方案的优缺点和适用场景,为工程师提供技术选型指南,帮助避免常见设计陷阱,提升高速网络设备开发的效率和可靠性。 阅读详情

相关推荐

【Stata双重差分模型】双重差分DID的具体操作步骤

本案例将详细阐述如何使用双重差分法进行实证分析,并展示具体的STATA操作代码。

a519573917的博客 2万+

数组名到底是不是指针

#include <stdio.h> #include <string.h> int main(void) { int a[3] = { 1, 2, 3 }; printf("%d\n", *a);//结果为1。此时数组名看起来又像是一个指针,但是却不能对这个指针进行++操作。 此时可能产生疑问,好像数组名在不作为函数参数的时候也能当作指针使用?那么为什么说数组名作为函数参数的时候才退化为指针呢。 实际上,数组名是这样使用的:数组名是一个指针,但是一个指针常量,其是一...

qq_39224221的博客 8359

用74LS194和555定时器DIY流水灯:一个经典的数字电路课程设计复盘(附Multisim仿真文件)

本文详细介绍了使用74LS194移位寄存器和555定时器搭建八路彩灯控制器的完整过程,包括硬件选型、电路设计、调试技巧及常见问题解决方案。作为经典的数字电路课程设计,该项目涵盖了EDA工具应用、电路原理图设计和Multisim仿真等核心技能,适合电子工程学习者实践参考。

weixin_29185199的博客 425

数组名到底是不是指针? --- 数组名与指针的区别

数组名是指针吗?数组名的本质是什么,为什么会和指针产生联系?

weixin_51626258的博客 5969

LEAP模型—低排放分析平台

LEAP 正在迅速成为进行综合资源规划、温室气体 (GHG) 缓解评估和低排放发展战略 (LEDS) 的国家的事实标准,尤其是在发展中国家,许多国家也选择使用 LEAP 作为其承诺的一部分向联合国气候变化框架公约(UNFCCC)报告。至少有 32 个国家使用 LEAP 来创建能源和排放情景,这些情景是其国家自主气候变化贡献计划 (INDC) 的基础:具有历史意义的巴黎气候协议的基础旨在表明各国开始经济脱碳的意图和投资于气候适应力。

weixin_54697010的博客 3279

gesp c++ 八级知识点

gesp c++ 八级知识点

MMD.然大大 2233

指针和数组名的区别和联系

一、首先,数组名不是指针!!! 我做了如下程序供大家学习和参考: #include <stdio.h> int main() { int *p; int *q; int a[15]; q = a; printf("指针 p 的大小是:%d\n", sizeof(p)); printf("指针 q 的大小是:%d\n", sizeof(q)); printf("数组 a 的大小是:%d\n", sizeof(a)); printf("

qq_55648035的博客 2028

PCB线路板的制作工艺流程分享!2021-08-21

Pcb板制作工艺流程:开料-钻孔-沉铜-压膜-曝光-显影-电铜-电锡-退膜-蚀刻-退锡-光学检测-印阻焊油-阻焊曝光、显影-字符-表面处理-成型-电测-终检-抽测-包装。具体如下:1、开料(CUT) 将原始的覆铜板切割成可以用在生产线上制作的板子过程2、钻孔 使PCB板层间产生通孔,以达到连通层间的目的。 3、沉铜 经过钻孔后的线路板在沉铜缸内会发生氧化还原反应,形成铜层对孔进行孔金属化,使原来绝缘的基材表面沉积上铜,达到层间电性相通。 4、压膜 压膜后的PCB板上面压了一层蓝色的干膜, 干膜是一个载体

jdbpcb88的博客 3246

何为指针,与数组名有什么区别

简单介绍了一下指针,一维数组和二维数组的数组名。指针数组与数组指针是什么

在嵌入式嵌入式领域奋斗的程序猿的博客 3422

Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤)

本文详细解析了Visual Studio调试时ntdll.dll的PDB文件缺失问题,提供了3种实用解决方案:调整调试设置、配置符号服务器与缓存目录、手动下载管理符号文件。通过分步指导和高级技巧,帮助开发者快速恢复完整的调试功能,特别适用于Windows平台下的C++项目开发。

weixin_42537919的博客 513

用大白话讲解Carplay(原创)

用大白话讲解Carplay: Carplay是美国苹果公司开发的一套服务,用户通过这套服务可以将iPhone与车载系统连接,然后在车载大屏上操作使用iPhone手机。个人理解,Carplay不能叫车载系统,不是操作系统,只能算一种服务。让你在车上的大屏上使用iPhone,这样用起来更方便,不需要在手机小屏幕上操作。基于这一点,有些人也说Carplay就是个投屏的功能,将手机屏幕投屏到了车机大屏上。可以简单这么理解,但是并不只是投屏这么简单,如果只是投屏的话,车子只是起到了一个显示器的功能,其实不止,手机和

cici2013的专栏 2万+

C语言中数组名和指针的区别及笔试题目

C语言中数组名和指针的区别 1: 指针是一个变量,而数组名不是。数组名是数组的首地址,即它本身就是一个地址。 2:假设a是一个数组名,而p是一个指针,当你使用 a 和 &a 时,得到值是一样的,都是数组的起始地址。而使用 p 和 &p 时,得到的值是不一样的, p 表示指针 p 所指向的地址,而 &p 表示 p 这个变量的地址。再假设 p = a; 则 p 就表示数组a的起始地址,而&p是存储数组a的起始地址的那个地址。 这是因为编译器把a当成数组首地址,而&a当作数组第一个

weixin_48856218的博客 1115

pycharm报错cannot start the IED:Error occurred during initialization of VMagent library failed...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1925

c语言学习零碎整理(7):数组名是指针吗?(补)

注:原文发表于 2005年09月13日 8:11 PM,因为今天修改了一下,保存后居然被莫明其妙地被删掉了,晕死!后通过百度快照找回(还有评论),现补记于下。今天在csdn的c版看到了这样的一个帖子,问的是数组和指针的区别.但最后引出的却是"数组名是指针吗?"这样一个问题.其中megaboy(飞天御剑流之杀神一刀斩) 的回答与众不同,按他对数组名的理解:数组名是一个符号地址常量,这个解

wayne 我的陋室我做主 1227

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码:int*p; p++;却不能写这样的代码:int a[]; a++;那么数组名跟指针之间到底有什么区别呢?第一,在声明上,除了作为函数参数的数组名总是编译器转化成指针,其他情况下,数组名就是数组名,指针就是指针,二者不能混淆,你不能在一个文件中定义一个数组,而在另一个文件中把它声明成一个指针。char a[];//定义一个数组a

宝宝 2374

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数组名和指针的区别

指针和数组的关系很微妙,之前一直不清不楚,今天好好的看了一下大家的意见,在此总结一下。 数组名不是指针 数组名神似指针数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组; 数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量; 指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址! 引用自此讨论区#24 此博客的讲解有一定作

楚燕狂子 590

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言——对数组名的理解

在C语言中,数组名可以被理解为指向数组首元素的指针。这意味着,当你使用数组名时,它会被自动转换为指向数组首元素的指针,即数组的第一个元素的地址。运行结果如下图所示:我们需要注意的是:arr和&arr是不同的运行结果如下图所示:通过运行结果我们可以发现:arr+1跳过的是一个整型的字节数&arr+1跳过的是一个数组的字节数。

ASHIDEH的博客 2119

c语言中,指针和数组关系紧密,但是两者不是等价的。数组名是指针常量,指针是变量

经过查询,标题这句话是正确滴!C语言中指针和数组的关系确实紧密,但它们并不等价。数组名是一个指向数组首元素的常量指针,而指针是一个可以改变指向的变量的地址的变量。是一个变量指针,最初指向数组的首元素,但后来被修改为指向数组的第三个元素。是数组的名字,它是一个常量指针,指向数组的首元素。的值,因为它是常量,但我们可以修改。的值,因为它是一个变量。

wanghao312的博客 932

指针和数组

数组名是(地址不可修改),但比普通指针多出类型和长度信息的类型是int[5](包含元素类型和长度)在大多数表达式中退化为指针,值为&arr[0]怎么证明数组名是首元素的地址呢?这里我们做一个测试观察结果:可见这两个地址是相同的,所以得出数组名就是数组⾸元素(第⼀个元素)的地址。2.数组名和指针的区别由上面我们提到的,难道数组名和指针就是一样的吗?其实大多数情况下我们可以把数组名视为指针,但是有一些特殊情况我们需要举例出来。

2401_83191546的博客 653

数组名与指针的联系和区别(数组名不是指针,而是关于“数组类型”的一个对象或者说变量 )

关于数组名,先说一下我的结论吧 1.数组名不是指针,它是“数组类型”的一个对象或者变量(就好比int i中的i,CString str当中的str) 2.“数组类型”的对象可以隐式转化为指针(当它转化为指针时,实际上是转化为指向数组第一个元素的指针) 先来看下面几个例子: -----------------------------------------------------------...

康心小萝卜头的博客 2553

数组名就是指针?

注:std::is_same 是一个用于比较两种类型是否相同的类型特征(type trait),value 是一个常量表达式,T 和 U 是待比较的类型,如果 T 和 U 相同,返回 true,否则返回 false。由此可见:arr的类型是一个int[5],而&arr的类型是int(*)[5]。比较一下在main函数和arr_type函数中你就会发现,arr的类型从int[5]变成了int*,证明在函数传递过程中发生了隐式转换,数组名退化成指针。输出结果是:T's type is A5_i。

qq_41936452的博客 710

数组名是指针么?

如果需要进一步操作(如动态分配数组),通常需要使用指针(如。数组名和指针有相似之处,但。在大多数表达式中,数组名会。是元素类型),但它是。(即不能重新赋值)。

andy0ma的博客 490

C/C++数组名与指针区别

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

peterpans的专栏 1598

数组名与指针的关系

数组名与指针的关系   在刚刚接触到数组与指针时,我想最常苦恼的问题就是数组名与指针之间有什么关系了吧。但是他们两者之间真的有什么数不清道不明的关系吗?答案无疑是否定的!接下来就让我们来一探究竟吧!   首先我们需要了解一下数组与指针的定义: 数组: 有序的元素序列,数组名有限个类型相同的变量的集合命名。数组在内存中所占的大小由数组长度以及成员类型大小决定。 指针: 又称指针变量,在32位...

Erica_ou的博客 2万+
上一篇: google的漂亮徽标
下一篇: 我的程序(2):c源码统计器
wayne92
博客等级 码龄23年 55粉丝 176原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值