C——指针与数组名的区别

昨天晚上做了一套企业面试题,第一题便是“数组名与指针的区别”做了才知道自己知之甚少,学长说像这样的题纸上那点地方是不够用的,而我们能写出来的仅仅是两三行而已。所以特地在网上搜了一下。

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

不同的是:

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

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

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

4、对数组名取地址&是合法的,但有些编译器不推荐这样做,对数组名取地址的结果与直接使用数组名的结果是一致的,这是C语言的一种特殊规定。有一个类似的效果就是函数名,假如func1是一个函数名,那么*func1==&func1==func1,这只是特殊用法,不代表函数名/数组名真的可以这么做。

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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用循环和下标来逐个打印数组的元素。下面是一个示例代码: ```c #include <stdio.h> int main() { int arr\[5\] = {1, 2, 3, 4, 5}; for (int i = 0; i < 5; i++) { printf("%d ", arr\[i\]); } return 0; } ``` 在这个示例中,我们使用了一个for循环来遍历数组,并使用下标`i`来访问数组的每个元素。然后使用`printf`函数打印出每个元素的值。输出结果将会是`1 2 3 4 5`。\[1\] 另外,你也可以使用指针来打印数组的元素。下面是一个示例代码: ```c #include <stdio.h> int main() { int arr\[5\] = {1, 2, 3, 4, 5}; int *p = arr; for (int i = 0; i < 5; i++) { printf("%d ", *(p + i)); } return 0; } ``` 在这个示例中,我们定义了一个指针`p`,并将其指向数组`arr`的首地址。然后使用指针的算术运算来访问数组的每个元素,并使用`printf`函数打印出每个元素的值。输出结果也将会是`1 2 3 4 5`。\[1\] 希望这个回答对你有帮助! #### 引用[.reference_title] - *1* [输出数组元素的方法(含指针)](https://blog.csdn.net/m0_69012020/article/details/127798389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言数组——字符数组](https://blog.csdn.net/csdn_wangchong/article/details/104364693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [[C语言]数组的传递](https://blog.csdn.net/qq_43559301/article/details/129219719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值