博客
关于我
C语言中的数组名的本质
阅读量:777 次
发布时间:2019-03-24

本文共 1917 字,大约阅读时间需要 6 分钟。

数组变量

数组变量名实际上是一个指针,这个指针指向数组中第一个元素a[0]的地址。在C语言中,数组变量本身就是一个指针,无需使用 "&" 取地址符。例如:

int a[5] = {1,2,3,4,5};

这里的a就是a[0]的指针地址。在验证代码时,可以看到输出结果应为相同的地址:

printf("%p\n", a); printf("%p\n", &a[0]);

输出结果为:000000000062FE00000000000062FE00

需要注意的是,数组不能通过赋值符号直接接收另一个数组的所有值。尝试直接赋值另一个数组给本数组是错误的:

int a[] = {1,2,3}; int b[] = a;

传入函数的数组

将数组作为函数参数传递时,函数接收的是原数组中a[0]的地址指针,而不是数组本身。因此在函数内部,可以使用 sizeof 来获取数组的大小,但需要通过 len 参数来传递大小。例如:

void see(int a[], int len){

函数参数a是一个指针,使用 sizeof(a) 来获取单个元素的大小,len则通过外部传递数组大小。可以通过 sizeof(int*) 确认数组大小是否正确:

printf("%d\n", sizeof(int*));

输出结果为:88

需要注意的是,数组参数可以通过数组运算符进行操作,但不直接对原数组进行操作。

数组变量是个特殊的指针

(1)数组变量本身是一个指针,可以直接操作。例如:

int a[10]; int *p = a;

(2)数组运算符可以对指针进行操作。例如,p[0] 等于 a[0]。

(3)*运算符可以对指针进行操作,例如 *a 等于 a[0]。需要注意的是,数组变量是 const 类型,无法赋值为其他数组。例如:

int a[] = {1,2,3}; int b[] = a;

(4)操作符 [*] 可以同时对数组和指针进行操作。例如,*a 等于 a[0],a* 指针到数组的起始位置。需要注意的是,数组变量本身表示的地址,不能用赋值符号直接赋值。例如:

int a[5] = {1,2,3,4,5}; *a = 10;

操作后,a[0] 被修改为10。通过比较 *a 和 a[0],可以验证两者的值是否相等。例如:

if(*a == a[0]) {

数组作为函数参数

当数组作为函数参数传递时,函数接收的是原数组中a[0]的地址指针,而数组大小需要通过外部的 len 参数传递。例如:

void see(int a[], int len){

在函数内部,可以使用 len 来处理数组大小。需要注意的是,原数组不能在函数中被修改。例如,传递数组大小可以通过 sizeof(a) / sizeof(a[0]) 来计算。例如:

int len = sizeof(a) / sizeof(a[0]);

数组变量的特殊性

数组变量是一个特殊的指针,不能像普通指针那样直接赋值。数组变量本身就是指向数组起始元素的指针。在操作数组变量时,需要注意以下几点:

1. 数组变量表示的是数组起始元素的地址,不能直接用赋值符号(&)操作。

2. 可以通过数组运算符 [ ] 对指针进行索引操作。例如,p[2] 等于数组中第三个元素(p + 2 这个地址的内容)。

3. 可以通过 * 运算符获取数组中的元素值,例如 *p 对应 a[0] 的值。需要注意的是,* 运算符会自动取指针指向内存单元的值。

4. 数组变量是 const 类型,不能修改其本身。例如,尝试重新赋值给数组变量是错误的。例如,int a[] = {1,2,3}; int b[] = a; 不能这样直接赋值。

函数参数中的数组实际上是一个指针,指向原数组中a[0]的地址。在函数中,数组大小需要通过外部参数传递。例如,可以使用 sizeof(a) / sizeof(a[0]) 来计算数组大小。需要注意的是,原数组的元素不能在函数中被修改。在函数声明时,以下四种函数原型是等价的:

int sum(int a[], int n); int sum(int*, int); int sum(int a[], int n); int sum(int[] , int);

需要注意的是,数组参数是一个指针,外部需要确保数组的元素可以被正确访问。例如,可以通过数组运算符直接操作指针。例如,p[5] 对应数组中第6个元素。通过 * 运算符可以获取单个元素的值。需要注意的是,数组参数是一个 const 类型,无法在函数内部修改数组的大小或指针地址。函数内部只能使用传入的数组大小来处理数组元素。

转载地址:http://okakk.baihongyu.com/

你可能感兴趣的文章
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>