function(char *) 와 function(const char *)의 차이점

은영신랑의 이미지

함수를 선언하는데 있어서

function(char *) ,
function(const char *)

const를 선언하는것에는 많은 차이가 있는건가요?

사용하는데 따른 차이점까지 설명해주시면 좋겠넹.

감사합니다.

litwind의 이미지

제가 알기로는

const 로 지정한 인자를

함수내에서 조작, 변형하려 하면 컴파일시 에러가 나는 걸로

알고 있습니다.

무엇이 더 필요하단 말인가...

aero의 이미지

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

char *do_change(char *s)
{
        strcpy(s,"bbb");
        return s;
}

int main()
{
        char *str;

        str = strdup("aaa");

        puts(str);
        do_change(str);
        puts(str);
}

결과
aaa
bbb

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

char *do_change(const char *s)
{
        strcpy(s,"bbb");
        return s;
}

int main()
{
        char *str;

        str = strdup("aaa");

        puts(str);
        do_change(str);
        puts(str);
}

결과
컴파일시

test.c: In function `do_change':
test.c:6: warning: passing arg 1 of `strcpy' discards qualifiers from pointer target type
test.c:7: warning: return discards qualifiers from pointer target type

위의 예제와 같이
const를 붙이면 함수내에서 포인터에 대한 조작이 불가능하게되므로
컴파일시 에러가 납니다. (gcc 에서 테스트)

notexist의 이미지

const로 하면 컴파일러가 더 최적화를 한다는것같던데요.
값이 바뀌지 않는다는 것을 가만해서 컴파일하니까요...

There is more than one way to do it...

익명 사용자의 이미지

aero wrote:
test.c: In function `do_change':
test.c:6: warning: passing arg 1 of `strcpy' discards qualifiers from pointer target type
test.c:7: warning: return discards qualifiers from pointer target type

위의 예제와 같이
const를 붙이면 함수내에서 포인터에 대한 조작이 불가능하게되므로
컴파일시 에러가 납니다. (gcc 에서 테스트)


이것은 포인터에 대한 조작이 불가능하게 되어 나는 에러가 아니라 const char *로 받은 인수를 char * 타입으로 다른 함수에 넘겨주려할 때 발생하는 경고입니다. 즉 const라는 qualifier(수식어,한정어)가 떨어져 나갔다는 뜻이죠. 에러가 아니므로 -Werror를 켜지 않는한 컴파일은 계속 수행됩니다.
cpulpul의 이미지

함수내 변경이 되어서는 안되는 경우 const를 붙여서 상수로 만드는 것입니다.

포인터가 붙는경우, 안붙는경우, const의 위치에 따라서 다른 영향을 미치니 조심해서 사용하여야 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.