[질문] 배열, 포인터, 문자열에 관한 간단한 질문...

caramis의 이미지

#include <iostream>
#include <string>

using namespace std;

int main() {
	string str1;
	char str2[20];
	char* str3 = new char [20];
	char temp[20];
	char* str4 = temp;
	char (*str5)[20];

	cin >> str1;
	cin >> str2;
	cin >> str3;
	cin >> str4;
	cin >> str5;
	

	cout << str1 << endl << str2 << endl;
	cout << str3 << endl << str4 << endl << str5 << endl;

	return 0;
}

str3 과 str4는 이상없는데 str5는 왜 에러가 나는지 궁금합니다.
또한 str4와 str5의 차이는 무엇인지 궁금합니다.

kihoori의 이미지

에러를 보시면 아시겠지만..

>> 연산자 에 배열 포인터에 대한 정의가 없기때문입니다..

Ooryl Qrygg의 이미지

#include <stdio.h>

int main()
{
  int a[2]={1,2}, *b=a, (*c)[2]=&a ;
  printf("a : b : *c\n");
  {
    int i;
    for (i=0; i<2; i++) 
      printf("%i : %i : %i\n", a[i], b[i], (*c)[i]);
  }
  return 0;
}

->
a : b : *c
1 : 1 : 1
2 : 2 : 2

Gands considered it the height of presumption to use personal pronouns to refer to themselves, because it arrogantly assumes the listeners know who the speaker is.

afsadfsaf의 이미지

Quote:

코드:
#include <iostream>
#include <string>

using namespace std;

int main() {
   string str1;
   char str2[20];
   char* str3 = new char [20];
   char temp[20];
   char* str4 = temp;
   char (*str5)[20];

   cin >> str1;
   cin >> str2;
   cin >> str3;
   cin >> str4;
   cin >> str5;
   

   cout << str1 << endl << str2 << endl;
   cout << str3 << endl << str4 << endl << str5 << endl;

   return 0;
}

str3 과 str4는 이상없는데 str5는 왜 에러가 나는지 궁금합니다.
또한 str4와 str5의 차이는 무엇인지 궁금합니다.

str5는 일단 char *str520개담을 수 있는 배열을 만듭니다.
그런데 char가 아니라 char * 이라는것에 주목 해보시면 쉽게 아실 수 있을겁니다.

Quote:
에러를 보시면 아시겠지만..
>> 연산자 에 배열 포인터에 대한 정의가 없기때문입니다..

결국, 이것이 정확한 이유이죠.
scanf를 이용하신다면, 에러가 없을겁니다. 하지만 그렇게 하시지 않는것이좋겠죠?

str4는 str4[char0][char1][char2][char3]...[char19] 이고
str5는 str5[char *0][char *1]...[char *19] 입니다.
[] 안의 숫자는 "몇번째" 라는걸 표시하기위해 함 써봤습니다;;

음 그런데 주제넘은 말이지만, 초기부터 이런것에 너무 신경쓰시다보면 프로그래밍에 대한 진정한 흥미를 잃으실 수가 있습니다 ^^;;

프로그래머들이 저런것을 아는 이유는, 이런것을 따로 공부해서가 아니라, 프로그램을 짜면서 그냥 익숙해진 언어에 대한 컨셉이랄까? 그런것 때문입니다.
슈퍼마리오3를(......;;)하면서 숨겨진 레벨이 어디있는지 다 아는것과 비슷한 맥락이지요..-_-

이런건 프로그래밍 실력이 어느정도된 후에, 한번쯤 생각해보시는것이 좋을것같네요.

그러니까, 이런것을 따로 공부해야하는것이아니라, 서서히 익숙해지면서 머릿속에 쌓인 생각들을 정리하는 수준에서 하는것이지요.

많은 프로그래밍 서적이나, 교수들이 그런건 잘 모르는 듯 하네요..

그래서 새로 입문하시는 분들에게 나쁜영향을..-_-;

제가이런말을 하는 이유는 저도 저런거에 집착하다가 3년이라는 세월을 낭비해봤기때문에...;;;

L-System

Ooryl Qrygg의 이미지

#include <stdio.h>

int main()
{
  int a[2]={1,2}, *b=a, (*c)[2]=&a ;


  printf("a : b : *c\n");
  {
    int i;
    for (i=0; i<2; i++) 
      printf("%i : %i : %i\n", a[i], b[i], (*c)[i]);
  }

  printf("\nthe comparison of sizes:\n");
  printf("the size of a : %i\n", sizeof(a));
  printf("the size of b : %i\n", sizeof(b));
  printf("the size of *b: %i\n", sizeof(*b));
  printf("the size of c: %i\n", sizeof(c));
  printf("the size of *c: %i\n", sizeof(*c));

  {
    char *a;
    char (*b)[100000], c[100000];
    printf("\nthe comparison of sizes again:\n");
    printf("the size of a: %i\n", sizeof(a));
    printf("the size of *a: %i\n", sizeof(*a));
    printf("the size of b: %i\n", sizeof(b));
    printf("the size of *b: %i\n", sizeof(*b));

    printf("\nhmmm...\n");

    /* (*b)[99999]=3; <- this causes Segmentation fault, so ...*/
    b=&c ;
    (*b)[99999]=3;
    printf("\ngood!\n");
  }

  return 0;
}

->result:

a : b : *c
1 : 1 : 1
2 : 2 : 2

the comparison of sizes:
the size of a : 8
the size of b : 4
the size of *b: 4
the size of c: 4
the size of *c: 8

the comparison of sizes again:
the size of a: 4
the size of *a: 1
the size of b: 4
the size of *b: 100000

hmmm...

good!

Gands considered it the height of presumption to use personal pronouns to refer to themselves, because it arrogantly assumes the listeners know who the speaker is.

신동익의 이미지

code는 수학식이 아닙니다.

   ..
   ..
   char*  str3 = new char [20];
   char    temp[20]; 
   char*  str4 = temp; 
   char   (*str5)[20]; 
   ..
   ..
str3 과 str4는 이상없는데 str5는 왜 에러가 나는지 궁금합니다. 
또한 str4와 str5의 차이는 무엇인지 궁금합니다.

str4는 포인터이고 str5는 배열포인터의 포인터 입니다.
str5는 당연히 초기화 되어야 겠죠.
따라서 다음과 같이 코드를 고치면 에러가 없습니다.
(고친 곳에 '//@' 을 달았습니다. )
#include <iostream> 
#include <string> 

using namespace std; 

int main() { 

   string str1; 
   char		str2[20]; 
   char*	str3 = new char [20]; 
   char		temp[20]; 
   char*	str4 = temp; 

   char		temp2[20];					//@
   char		(*str5)[20] = &temp2 ;		//@

   cin >> str1 ; 
   cin >> str2 ; 
   cin >> str3 ; 
   cin >> str4 ; 
   cin >> *str5 ;						//@
   

   cout << str1 << endl << str2 << endl; 
   cout << str3 << endl << str4 << endl << *str5 << endl;	//@

   return 0; 
} 

2:^)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.