理解一维数组中 buf、buf[0]、&buf[0]、&buf 四个符号的含义

本文内容摘自《C语言内核深度解析》一书的深入学习数组部分。

以 int buf[100]={0} 为例,集中讨论 buf、buf[0]、&buf[0]、&buf 四个字符含义的内涵。

1、buf:有两层含义,一是数组名,sizeof(buf) 时就是数组名的含义;二是等价于 &buf[0],表示数组的第一个元素的首字节地址,是一个常量值。因此,既然是一个常量值,无论从哪层含义来使用,buf 都不能作为左值来使用,但是,buf 可以用来作为右值来使用,作为右值使用时,应理解为地址。

2、buf[0]:表示存储第一个元素的空间,可对其进行读写操作,所以可以作为左值来使用。

3、&buf[0]:等价于 buf,是一个地址常量,只能作为右值使用。

4、&buf:表示地址的首地址,是一个地址常量,只能作为右值使用。

buf 与 &buf 的值相等,但是含义完全不同。printf("%p\n",buf) 与 printf("%p\n",&buf) 这两条代码的打印结果是相同的,表明它们的值是相同的,但是 printf("%p\n",buf+1) 与 printf("%p\n",&buf+1) 的结果完全不同,因为它们的含义不同,buf 表示数组的第一个元素的首字节地址,加 1 加的时一个元素空间的大小;&buf 表示的是整个数组的首地址,加 1 加的是整个数组空间大小,数组首地址主要用于构建多维数组,对于一维数组来说,数组首地址没有太大的实用意义。

  • 12
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以按照以下步骤使用指针操作来去除二维字符数组的非英文字母: 1. 声明一个 char 类型的指针变量 `ptr`,用于遍历数组。 2. 使用两层循环遍历二维数组 `buf` 的每个元素。 3. 在内层循环,使用指针 `ptr` 指向当前元素。 4. 使用 `isalpha()` 函数检查当前指针指向的字符是否为英文字母。若是,则保留该字符;若不是,则将其剔除。 5. 将指针 `ptr` 向后移动一个位置,继续检查下一个字符,直到遇到字符串结束符 `\0`。 6. 将最后一个字符设置为字符串结束符 `\0`,以便正确终止字符串。 7. 重复步骤 3-6,直到遍历完整个二维数组。 下面是一个示例代码实现: ```c #include <stdio.h> #include <ctype.h> void removeNonAlpha(char buf[][20], int rows) { for (int i = 0; i < rows; i++) { char *ptr = buf[i]; // 指向当前行的首字符 while (*ptr != '\0') { if (isalpha(*ptr)) { ptr++; // 指向下一个字符 } else { char *temp = ptr; while (*temp != '\0') { *temp = *(temp + 1); // 剔除当前字符,将后面的字符前移 temp++; } } } } } int main() { char buf[6][20] = { "Hello, 你好!", "This is a test.", "Only alphabets here.", "No numbers or symbols.", "Goodbye!", "" }; removeNonAlpha(buf, 6); for (int i = 0; i < 6; i++) { printf("%s\n", buf[i]); } return 0; } ``` 这段代码会输出去除非英文字母后的结果: ``` Hello Thisisatest Onlyalphabetshere Nonumbersorsymbols Goodbye ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值