首页 > 解决方案 > 作为指针的参数未正确递增

问题描述

我有一个函数可以计算字符串中元音和辅音的数量:

void CountVowelsConsonants(char* str, int *vowels, int *consonants){
    size_t size=strlen(str);
    //size-1 because of the '\n' at the end of the string when pressing enter
    for (int i = 0; i < size ; ++i) {
        char c = str[i];
            if(c=='A' || c== 'E' || c=='I' || c== 'O' || c=='U' ||
                    c=='a' || c== 'e' || c=='i' || c== 'o' || c=='u'){
                *vowels++;
            }
        }
    *consonants= size-1 - *vowels;
    }

但是当我调用这个函数时,例如:

int vowels;
int consonants;
CountVowelsConsonants("abc", &vowels, &consonants);

它返回:

Vowels: -858993460
Consonants: 858993463

代替:

Vowels: 1
Consonants: 2

我想知道为什么会这样。

我有一个阶乘函数,它具有类似的指针实现,并且可以正常工作:

void factorial(int n, int*fac){
    *fac=1;
    for (int i = 2; i <=  n; ++i) {
        *fac*=i;
    }
}

访问阶乘函数中的事实指针将正确更改值。唯一的区别是在CountVowelsConsonants函数中我增加了 1 而不是相乘。

但是,如果我访问 CountVowelsConsonants 函数中的元音指针来增加它会在计数中产生错误。

我的 IDE(CLion)会将*in变灰*vowels,表示指针运算符 in *vowels++;没用。

关于为什么会这样的任何想法?

标签: cloopsfor-looppointersparameter-passing

解决方案


代替:

*vowels++;

这相当于:

*vowels;            // this does nothing, that's what your IDE was telling you
vowel = vowels + 1; // this increments the vowels pointer,
                    // which is also pretty useless here

你需要这样写:

(*vowels)++;

这相当于这个,这是你真正想要的:

*vowels = *vowels + 1;

运算符的优先级++1,而*(取消引用)运算符的优先级是 2。


推荐阅读