2014-12-06 4 views
-2

Вопрос, который я пытаюсь выполнить в процессе подготовки к экзамену выглядит следующим образом:Путаница между передаче по значению или по ссылке

: Рассмотрим функцию с этим прототипом: недействительным обращенного (список обугленного [], символ сп 1 , char ch2); Функция «convert» изменяет каждый символ chi, который находит внутри «списка» в символ ch2. Например, вызов функции "convert (name, 'a', 'z')" преобразует каждый 'a' в 'z' внутри массива с именем «name». Напишите определение функции «convert».

Моя программа запускается до конца двух функций scanf в основном, я смотрю, как передавать параметры без использования указателей.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

char list[]; 
char ch1; 
char ch2; 

void convert(char list[], char ch1, char ch2); 

int main() 
{ 
    char list[15]; 
    char ch1, ch2; 
    printf("Enter a string of characters:"); 
    scanf("%s", list); 
    printf("Enter the first letter:"); 
    scanf("%c\n", &ch1); 
    printf("Enter the second letter:"); 
    scanf("%c\n", &ch2); 
} 
void convert(char list[], char ch1, char ch2) 
{ 
    int wordcount; 
    int i = 0; 
    int x = 0; 
    int y = 0; 
    if (list[i] == ch1) 
    { 
     x++; 
     list[i] = ch2; 

    } 
    else if (list[i] != ch1) 
    { 
     y++; 


    } 
    else if (list[i] == NULL) 
    { 
     wordcount = (y + x + 1); 

    } 

    printf("In the string there are %d letters and in %s the letter %c was changed to %c, %d   times.", wordcount , list, ch1, ch2, x); 

}

+1

call 'convert (list, ch1, ch2);' main. но 1-й аргумент преобразования ('char list []') является ** указателем **, а не массивом. – BLUEPIXY

+0

, когда Array переходит к функции, передает значение (указателя). если вы можете изменить прототип, wrap of Array по struct pass by value (include array). – BLUEPIXY

+0

Спасибо, я думал, что идея объявления глобальных переменных заключалась в том, чтобы позволить различным функциям работать с переменной. Также я просто хотел уточнить, что указатель идет в начале основного текста, где написана строка? –

ответ

0

ч1 и ch2 уже глобальный характер, так что вам не нужно, чтобы передать что-нибудь, чтобы преобразовать. Как это:

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 
    4 char list[15]; 
    5 char ch1; 
    6 char ch2; 
    7 
    8 void convert(); 
    9 
10 int main() 
11 { 
12  scanf("%c\n",&ch1); 
13  scanf("%c",&ch2); 
14  printf("char 1: %c, char2: %c\n",ch1,ch2); 
15  convert(); 
16  printf("char 1: %c, char2: %c\n",ch1,ch2); 
17  return 0; 
18 } 
19 
20 void convert() 
21 { 
22  char temp; 
23  temp=ch1; 
24  ch1=ch2; 
25  ch2=temp; 
26 } 
+0

люблю простоту, спасибо. –

+0

нет проблем, если этот ответ будет работать для вас, вы должны отметить его как принятый ответ (галочка, нажмите, чтобы включить его) – hft

3

Чтобы быть строгим нет «проходящий по ссылке» в C, как в Fortran или var в Pascal. Все аргументы передаются просто «по значению» (иногда его также называют «копией»).

Первое объявление параметр:

void convert(char list[], char ch1, char ch2) { .. } 

средства эффективно:

void convert(char *list, char ch1, char ch2) { .. } 

где list локальная переменная указатель функции по типу char *. Он не имеет ничего общего с массивом list, объявленным в main(). Другими словами, оба они расположены в разных пределах. Мы говорим, что массив list (от main()) «распадается» на указатель, который содержит адрес его первого элемента, тогда значение этого указателя присваивается параметру list.

+0

Это очень полезно спасибо. –