首页 > 其他分享 >数组名和指针区别(转)

数组名和指针区别(转)

时间:2023-06-06 14:23:31浏览次数:39  
标签:func1 函数 区别 数组名 数组 sizeof 指针

指针和数组名的共同特点是都是用来指代一个地址的。

不同的是:

1、指针是需要占用内存空间来存储地址的;数组名则更像是一个立即数或者常数。你可以修改指针指向的内容,但你绝对无法改变数组名的指向

2、数组和指针对于sizeof来说是不同的,指针变量占用的空间通常等于当前CPU的最大位数,数组名取sizeof的话,得到的则是数组的大小。、

      但是把数组名作为参数传给一个形参为指针的函数,它在这个函数里就变成了普通指针,你用sizeof(数组名)得到的是指针大小而不是数组大小。

      如果你的函数应该接收数组名而不是指针的话,那应该声明成:

      void func(int arr[], int N);   //其中N为数组大小。这样写之后在函数体里sizeof(arr)一样只会得到指针的大小而不会得到数组大小

      而不是

      void func(int *arr);

3、如果用extern声明一个外部变量,指针和数组不能混用。比如在文件1.cpp里声明了char ca[]=“abcde”,在文件2.cpp里如果要引用,那么必须是extern char ca[]而不是extern char * ca,因为前者是常数,后者是一个占用了内存空间的有效的变量,区别还是很大的。

4、对数组名取地址&是合法的,但有些编译器不推荐这样做,对数组名取地址的结果与直接使用数组名的结果是一致的,这是C语言的一种特殊规定。

有一个类似的效果就是函数名,假如func1是一个函数名,那么*func1==&func1==func1,这只是特殊用法,不代表函数名/数组名真的可以这么做

作者:时国怀
链接:https://www.zhihu.com/question/23059655/answer/23485680

 

数组就是数组,但是他可以隐式转换成指针。当一个重载函数分别接受数组和指针的时候,肯定还是数组的那个命中。参见sizeof和strcpy_s。

数组不能被直接复制,所以当数组名作为函数参数的时候,要么就是数组的引用,要么就是指向第一个元素的指针,他们的值是相等的。当你对一个数组做&的时候,他提取的是指向数组的指针,然后仍然可以隐式转换成指向第一个元素的指针,而且它们的值是相等的。所以对于printf这种只认binary的函数来讲,自然会输出一样的结果。

作者:vczh
链接:https://www.zhihu.com/question/23059655/answer/23484315

标签:func1,函数,区别,数组名,数组,sizeof,指针
From: https://www.cnblogs.com/tan-wm/p/17460421.html

相关文章

  • java中equals与matches区别
    matches:判断字符是否与指定的正则表达式相匹配equals:判断二个字符串是否相等举例:1.看例题https://www.nowcoder.com/share/jump/3295745116860251147252.看例题https://www.nowcoder.com/share/jump/329574511686025148552总结:一个是判断是否符合正则表达式规则,另一个是判断是......
  • 空间(虚拟主机)与服务器的区别 45.250.42.x
    虚拟主机和服务器,属于被包含的关系,虚拟主机是利用网络空间技术,把一台服务器分成许多的“虚拟小空间”,每一个网络空间都具有完整的Internet服务功能,服务器是真实存在的物理设备;虚拟空间是虚拟出来的主机,是一台服务器里的一部分硬盘空间,一台服务器上存在多个虚拟主机两者在成本方面存......
  • C指针
    一、指针基础1.不同内存变量的作用域和生命周期2.指针与底层硬件联系紧密,指针可操作数据的地址,实现对数据的简介访问。3.指针的使用场景:3.1使用指针传递大容量的参数,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用。......
  • C++智能指针的原理和实现
    一、智能指针起因在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针;delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。使用堆内存是非常频繁的操作,容易造成......
  • 浅谈mysql索引类型(normal、unique、full textl) 的区别和使用场景
    mysql索引类型mysql索引类型normal,unique,fulltext的区别是什么?normal:表示普通索引unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为uniquefulltextl:表示全文搜索的索引。FULLTEXT用于搜索很长一篇文章的时候,效果最好。用在......
  • 正则表达式中 () 、[] 、{}的区别
    正则表达式的()[]{}有着不同的意思。()是为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串(\s*)表示连续空格的字符串[]是定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*表示空格或者*号]{}一般是用来匹配的长度。比如\s......
  • vs中.\ 与 ..\ 区别
    在VisualStudio中,.和..是表示相对路径的两个特殊符号。.表示当前目录,例如:.\file.txt表示当前目录下的文件"file.txt"。..表示上一级目录,例如:..\file.txt表示上一级目录(即父目录)下的文件"file.txt"。.和..在路径表示中的作用是不同的。其中.代表当前目录,通常用......
  • TypeScript Vs JavaScript 区别
    一、观察1.JS平常的复制类型letval;val=123;val="123";val=true;val=[1,3,5];注意点:由于JS是弱类型的,所以只要定义了一个变量,就可以往这个变量中存储任意类型的数据也正是因为如此,所以会给我们带来一个问题2.假设a是一个数组,b是一个数值func......
  • C#中抽象类和接口的区别与使用
    抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象......
  • Docker 和虚拟机的区别
    虚拟机基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。主操作系统(HostOperatingSystem)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的......