数组迭代循环中使用下标和指针的区别

我们来看一下2组例子:

第一组例子:

下标表达式:

a = get_value();
array[a] = 0;

指针表达式:

a = get_value();
*(array + a) = 0;

第二组例子:

下标表达式:

int array[10], a;
for(a=0; a<10; a+=1) {
    array[a] = 0;
}

指针表达式:

int array[10], *ap;
for(a=array; a < array + 10; ap++) {
    *ap = 0;
}

这2组例子都是一个使用下标,一个使用指针,每组例子的2中方式都实现相同的效果,但这2组例子使用下标和指针访问数组元素效率是一样的吗?

第一组例子效率完全一致,第二组例子循环体所有区别,计数器1和整形长度相乘,然后和指针相加,每次执行乘法迅运算都是相同的1和4。而指针每次都是相同的1和4相乘,而且只是在编译时执行一次,后面就是把指针和4相加。

它们到底怎么工作的呢?接下来,我们就来研究一下:

一、先看一个下标版本

#include <stdio.h>

#define SIZE 50
int x[SIZE];
int y[SIZE];
int i;
int *p1, *p2;

void try1() {
    for(i = 0; i < SIZE; i++) {
        x[i] = y[i];
    }
}


int main () {
    try1();
    return 0;
}

编译获得汇编代码:

	.file	"main.c"
	.text
	.globl	x
	.bss
	.align 32
	.type	x, @object
	.size	x, 200
x:
	.zero	200
	.globl	y
	.align 32
	.type	y, @object
	.size	y, 200
y:
	.zero	200
	.globl	i
	.align 4
	.type	i, @object
	.size	i, 4
i:
	.zero	4
	.globl	p1
	.align 8
	.type	p1, @object
	.size	p1, 8
p1:
	.zero	8
	.globl	p2
	.align 8
	.type	p2, @object
	.size	p2, 8
p2:
	.zero	8
	.text
	.globl	try1
	.type	try1, @function
try1:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$0, i(%rip)
	jmp	.L2
.L3:
	movl	i(%rip), %eax
	movl	i(%rip), %ecx
	cltq
	movl	y(,%rax,4), %edx
	movslq	%ecx, %rax
	movl	%edx, x(,%rax,4)
	movl	i(%rip), %eax
	addl	$1, %eax
	movl	%eax, i(%rip)
.L2:
	movl	i(%rip), %eax
	cmpl	$49, %eax
	jle	.L3
	nop
	nop
	popq
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: #include<iostream> using namespace std; int main(){ char arr[] = "Hello World!"; char *p = arr; while(*p != '\0'){ if(*p == ' '){ *p = '_'; } p++; } cout << arr << endl; // 输出:Hello_World! return 0; } ### 回答2: 要编写程序用下划线替换数组的空格元素,使用指针访问数组,不能使用下标。我们可以按照以下步骤进行编写: 1. 首先,定义一个字符指针变量,指向数组的起始地址。假设数组名为arr。将指针变量p指向arr。 2. 使用循环,判断当前指向的字符是否为空格。若为空格,则将指针变量p指向的字符替换为下划线。 3. 使用指针运算,将指针变量p向后移动到下一个字符的地址。这可以通过将p加1来实现。 4. 重复步骤2和步骤3,直到遍历完整个数组。 5. 最后,输出替换完成的数组。 下面是一个示例代码的实现: ```c #include <stdio.h> void replaceSpace(char* arr) { char* p = arr; // 定义一个指针变量,指向数组的起始地址 while (*p != '\0') { // 遍历数组直到遇到字符串结束符 if (*p == ' ') { // 判断当前指向的字符是否为空格 *p = '_'; // 若为空格,则替换为下划线 } p++; // 将指针变量向后移动到下一个字符的地址 } } int main() { char arr[] = "Hello World!"; // 示例数组 replaceSpace(arr); // 调用函数替换空格 printf("%s\n", arr); // 输出替换完成的数组 return 0; } ``` 以上代码将输出"Hello_World!",其空格已被下划线替换。这样,我们就成功地用指针访问数组,并且实现了空格替换的功能。 ### 回答3: 要编写程序,用下划线替换数组的空格元素,使用指针访问数组,不能使用下标。 首先,我们需要定义一个待处理的数组,其包含空格元素。然后,我们将创建一个指针变量,用于访问数组的每个元素。接下来,我们使用循环来遍历整个数组,直到指针指向数组的末尾。 在每个,我们将检查当前指针所指向的元素是否为空格。如果是空格,则将其替换为下划线。为了实现这一点,我们可以使用条件语句来比较当前元素与空格的ASCII值(32)是否相等。如果相等,则将指针所指向的值修改为下划线的ASCII值(95)。 最后,我们继续向下移动指针,以便访问下一个元素。这可以通过将指针变量递增一个单位实现。 下面是一个示例程序: ```c++ #include <iostream> using namespace std; int main() { // 定义待处理的数组 char arr[] = "Hello world! This is a test."; // 创建指向数组指针 char* ptr = arr; // 遍历数组并替换空格元素 while (*ptr != '\0') { if (*ptr == ' ') { *ptr = '_'; } ptr++; } // 输出替换后的数组 cout << arr << endl; return 0; } ``` 在这个示例程序,我们首先定义了一个包含空格元素的字符数组。然后,我们创建了一个指针变量 `ptr`,并将其指向数组的起始位置。接下来,我们使用一个 `while` 循环来遍历数组的每个元素,直到指针指向数组的结束标志 `'\0'`。在每个,我们检查指针指向元素的值是否为 `' '`,如果是,则将其替换为 `'_'`。最后,我们递增指针,继续向下遍历数组。最终,我们输出替换后的数组。 这样,我们就成功地编写了一个程序,用下划线替换数组的空格元素,并使用指针来访问数组,而不使用下标

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值