указатели в с (начинающий) - PullRequest
1 голос
/ 15 апреля 2011

Я только начал смотреть на C, исходя из фона Java. Мне трудно оборачивать голову указателями. Теоретически я чувствую, что у меня это получается, но как только я пытаюсь использовать их или следовать программе, которая их использует, я довольно быстро теряюсь. Я пытался выполнить упражнение по конкататуре строк, но оно не работало, поэтому я сократил его до некоторой базовой практики указателя. Это соответствует предупреждению конфликтующих типов для функции strcat, и когда я запускаю его, происходит сбой полностью.

Спасибо за любую помощь

#include <stdio.h>
#include <stdlib.h>
/* strcat: concatenate t to end of s; s must be big enough */
void strcat(char *string, char *attach);


int main(){
char one[10]="test";
char two[10]="co";
char *s;
char *t;
s=one;
t=two;
strcat(s,t);
}

void strcat(char *s, char *t) {

    printf("%s",*s);




}

Ответы [ 5 ]

5 голосов
/ 15 апреля 2011

Ваш printf() должен выглядеть так:

printf("%s",s);

Звездочка не нужна. Аргумент формата %s означает, что аргумент должен быть char*, то есть s. Префикс s с * делает дополнительную недопустимую косвенную ссылку.

Вы получаете предупреждение о конфликтующих типах, потому что strchr - это стандартная библиотечная процедура, которая должна иметь эту подпись:

char * strcat ( char * destination, const char * source );

У вас другой тип возврата. Вам, вероятно, следует переименовать свой в mystrchr или что-то еще, чтобы избежать конфликта со стандартной библиотекой (вы можете получить ошибки компоновщика, если используете то же имя).

0 голосов
/ 25 октября 2015

указатели являются переменными, которые указывают на адрес переменной.

#include "stdio.h"
void main(){
  int a,*b;
  a=10;
  b=&a;
  printf("%d",b);
}

в следующем коде вы увидите int 'a' и указатель 'b'.
здесь b берется как указатель на целое число и объявляется путем предоставления
'' перед ним. '' объявляет, что 'b' является указателем. тогда вы увидите "b = & a". Это означает b принимает адрес целого числа «a», которое хранит значение 10 в этой конкретной памяти, а printf печатает это значение.

0 голосов
/ 03 мая 2015

Замена *s на s пока не добавляет строки, вот полностью рабочий код:


Обратите внимание на функцию urstrcat

#include <stdio.h>
#include <stdlib.h>
/* urstrcat: concatenate t to end of s; s must be big enough */
void urstrcat(char *string, char *attach);


int main(){
char one[10]="test";
char two[10]="co";
char *s;
char *t;
s=one;
t=two;
urstrcat(s,t);
return 0;
}

void urstrcat(char *s, char *t) {

    printf("%s%s",s,t);
}
0 голосов
/ 15 апреля 2011

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

printf( "%s", s );

Кстати, strcat - это стандартная функция, которая возвращает указатель на массив символов. Зачем делать свой собственный?

0 голосов
/ 15 апреля 2011

Изменение

printf("%s",*s);

до

printf("%s",s);

Причина этого в том, что printf ожидает замены для %s указателем. Он будет разыменовывать его внутри, чтобы получить значение.

Поскольку вы объявили s как указатель char (char *s), тип s в вашей функции будет просто указателем на char. Таким образом, вы можете просто передать этот указатель прямо в printf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...