首页 > 解决方案 > 将保存数组元素的指针的地址传递给c ++中的函数时出错

问题描述

我创建了一个字符数组,然后将它们分配给一个指针。然后我将该指针地址传递给一个函数,该函数将逐个字符地反转数组并将它们打印出来。我无法理解我的代码中的错误。

// ConsoleApplication1.cpp : This file contains the 'main' function. 
// Program execution begins and ends there.

#include <iostream>
#include<conio.h>
using namespace std;
void reverses(char* p) {
    int count = 17;
    for (int i = 0; i < 18; i++) {

        cout << *(p + i);
        char temp = *(p + i);
        *(p + i) = *(p + count);
        *(p + count) = temp;
        count--;
        cout << *(p + i);           
    }
}
int main() {
    char names[18] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 
                       'j','k','l','m','n','o','p','q','r' };
    char* ptr = &names[0];

    for (int i = 0; i < 18; i++) {
        reverses(ptr + i);
    }
}

标签: c++pointers

解决方案


你在一个循环中调用了 18 次 reverse 函数,每次你传递一个指向 char 数组的下一个字符的指针,所以在第二个循环之后,你已经在访问数组边界之外的元素。

仅调用reverses一次,并在还原完成后打印字符。

void reverses(char* p) {
    int count = 17;
    for (int i = 0; i < 18 / 2; i++) {
        char temp = *(p + i);
        *(p + i) = *(p + count);
        *(p + count) = temp;
        count--;  
    }
}

int main()
{
    char names[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
                      'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r'};
    char *ptr = &names[0];
    reverses(ptr);

    for(int i = 0; i < 18; i++){
        std::cout << ptr[i];
    }  
}

请注意,对于一个简单的反向例程,只需要一半的周期,否则您将数组返回到它的原始形式。


这是一个简化的,因此更易读的版本,您将数组的大小作为参数传递:

void reverses(char *p, int size)
{
    for (int i = 0; i < size / 2; i++, size--) // size would be 18
    {
        char temp = p[i]; // swap routine
        p[i] = p[size - 1];
        p[size - 1] = temp;      
    }
}

使用[]数组表示法更简单且更具可读性,但如果您愿意,可以使用指针表示法:

void reverses(char *p, int size)
{
    for (int i = 0; i < size / 2; i++, size--)
    {
        char temp = *(p + i);
        *(p + i) = *(p + size - 1);
        *(p + size - 1) = temp;      
    }
}

最终结果相同,但代码可读性较差。


我会使用算法库std::reverse

#include <algorithm>

//...

std::reverse(ptr, ptr + 17);

for(int i = 0; i < 18; i++){
    std::cout << ptr[i];
}

推荐阅读