char *
의 가치를 바꾸는 방법에 대해 혼란스러워한다.
기능 간.
예 :
#include <stdio.h>
void testing(char *s) {
s = "hi";
} // testing
int main() {
char *s = "hello";
testing(s);
printf("%s\n", s);
} // main
이 경우, s 값은 변경되지 않으며
"hello"
인쇄됩니다.
s
를 어떻게 바꿀 수 있습니까
, 함수의 반환 유형이나 매개 변수를 변경하지 않고?
-
답변 # 1
-
답변 # 2
main
에서char *s
문자열 리터럴"hello"
로 초기화됩니다. . 이것은s
를 의미 6char
의 익명 배열을 가리킬 것입니다.{ 'h', 'e', 'l', 'l', o', '\0' }
값을 포함 . 그러나이 배열의 내용은 표준에 관한 한 수정할 수 없으므로이 배열에 쓰는 코드는정의되지 않은 동작을 나타냅니다.testing
에 전화 매개 변수char *s
함수 내에서 지역 변수로 취급됩니다. 포인터 값을 변경해도char *s
에 영향을 미치지 않습니다main
의 변수 . C 함수 호출에서 모든 매개 변수는값으로전달됩니다.testing
내 , 당신은s
를 변경 다른 문자열 리터럴"hi"
를 가리 키려면 .main
의 초기화와 유사testing
s
3char
의 익명 배열을 가리 킵니다.{ 'h', 'i', '\0' }
값을 포함 . 이 익명 배열의 내용은 수정할 수 없습니다. 위에서 언급했듯이 이것은main
에 영향을 미치지 않습니다.s
포인터.매개 변수를 수정하거나 두 함수의 반환 유형을 원하지 않는다고 언급했습니다. 그렇게하기 위해,
testing
매개 변수s
가 가리키는 배열의 내용을 덮어 써야합니다. .main
의 현재 코드부터 와이즈 비즈 수정할 수없는 배열을 가리키는 경우 수정 가능한 배열을 가리 키도록 변경해야합니다. 이것은s
를 변경하여 수행 할 수 있습니다main
포인터 대신 배열로 :s
그런 다음
int main() { char s[] = "hello"; // N.B. s[] is 6 chars long including the null terminator testing(s); printf("%s\n", s); } // main
를 변경할 수 있습니다 매개 변수testing
가 가리키는 배열의 내용을 겹쳐 쓰려면 :s
나는
너무 많은#include <string.h> void testing(char *s) { strcpy(s, "hi"); } // testing
를 사용했다 위 버전의strcpy
에서 표준 라이브러리 기능 .testing
를 쓰지 않도록하는 것은 당신에게 달려 있습니다.char
가 가리키는 배열에 s .배열
s
의 길이 main에서 초기화 프로그램 "hello"(5 자 + null 종료 자 문자)에 의해 자동으로 6으로 설정되었습니다. 6 개 이상의s
를 덮어 써야하는 경우 명시 적으로 배열의 길이를 설정할 수 있습니다. 널 종료자를 포함하여 :char
-
답변 # 3
함수는 인수 값의 사본 만받습니다 :
char s[100] = "hello"; // s[100] has space for 99 characters plus a null terminator.
함수를 돌려서 값을 돌려받을 수 있습니다 :
void f(int x) // x is a new variable that is initialized to the argument value. { x = x + 3; // Adds 3 to the local x. printf("%d\n", x); // Prints 8. } int main(void) { int x = 5; f(x); // Passes 5, not x, to f. printf("%d\n", x); // Prints 5, not 8. }
함수가 객체의 값을 변경하도록하여 함수에서 값을 다시 가져올 수도 있습니다. 이렇게하려면 객체의 주소를 함수에 제공해야합니다.
int f(int x) // Function is changed to return int. { x = x + 3; // Adds 3 to the local x. printf("%d\n", x); // Prints 8. return x; // Returns new value. } int main(void) { int x = 5; x = f(x); // Set x from the value returned by the function. printf("%d\n", x); // Prints 8. }
함수를 변경하는 함수를 원한다면, 포인터의 주소를 전달할 수 있습니다 :
void f(int *p) // p is a pointer to an int. { *p = *p + 3; // Adds 3 to the pointed-to int. printf("%d\n", *p); // Prints 8. } int main(void) { int x = 5; f(&x); // Passes address of x to f. printf("%d\n", x); // Prints 8. }
void f(char **p) // p is a pointer to a pointer to a char. { *p = "hi" // Sets *p to point to (first character of) "hi". printf("%s\n", x); // Prints "hi". } int main(void) { char *s = "hello"; // Sets s to point to (first character of) "hello". f(&s); // Passes address of s to f. printf("%s\n", x); // Prints "hi". }
관련 자료
- python 3.x - Pandas의 다른 탭에서 일치에 따라 값 변경
- c++ - 함수 간 변수 조작
- mysql - 값 변경시 선택
- javascript - 선택 옵션에 따라 Alpine JS 변경 레이블/텍스트 상자 값
- drupal - imagehtmltwig 템플릿 내에서 Alt 값을 변경할 수 있습니까?
- python - 클래스 외부에서 클래스 속성 값 변경
- c++ - const int에 포인터 값을 int 포인터에 할당 할 수없는 이유는 무엇입니까?
- c - "포인터 반환 함수"의 인수를 null로 안전하게 만드는 방법은 무엇입니까?
- jq로 모든 키의 값 변경
- oop - JAVA에서 이것을 사용하여 ENUM 클래스 함수 내에서 ENUM의 값을 변경하십시오
- vue.js - 여러 조건에 따라 배열의 항목 값을 변경하려면 어떻게해야합니까?
- javascript - From 외부에서 Formik TextField 값을 어떻게 변경합니까?
- javascript - x-for 변수의 값을 테스트하고 값에 따라 CSS 스타일을 변경하는 방법은 무엇입니까?
- CSS의 값에 따라 요소의 색상 변경
- javascript - 배열의 특정 값을 변경하고 배열이 비어 있습니다
- vue.js - 쿠키 값 변경시 Vue 다시 렌더링
- python - Django 모델이 값으로 반환하는 것을 변경하는 방법은 무엇입니까?
- python - HTML 페이지에서 렌더링하기 전에 뷰의 값 변경
- xslt 1.0 - xsl의 텍스트 사이에 동적 값을 제공하는 방법은 무엇입니까?
- Angular의 변경시 html에서 구독 값을 업데이트하는 방법은 무엇입니까?
- pointers - C에서 sizeof (x) VS while ([x]! = '\ 0')
- c - 가리키는 메모리를 재 할당 한 후 포인터를 재사용 할 수 있습니까?
- c - 포인터 표기법을 사용하여 3 차원 벡터의 크기를 얻는 방법이 있습니까?
- 첨자 값은 C 프로그램에서 배열도 포인터도 벡터도 아닙니다
- c - 포인터를 사용하여 uint8_t 배열의 두 요소를 uint16_t 변수에 복사
- c - 포인터와 구조체 유형의 크기가 일관 적이 지 않은 것처럼 보이는 이유는 무엇입니까?
- c - 포인터를 초기화 할 때 배열을 type []으로 캐스팅해야하는 이유는 무엇입니까?
- c++ - c 코드를 컴파일 할 때 g ++에서 calloc 포인터 유형 오류를 무시하도록하는 방법
- c - 조건부 점프 또는 이동은 함수에서 돌아온 후 초기화되지 않은 값에 따라 달라집니다
- C의 함수에서 반환되는 포인터 문자열 인쇄
C 함수 호출은 엄격하게 값을 전달합니다. 이것은 당신이
s
를 통과하면 의미testing
로 로컬 사본이 작성됩니다.s
에 새로운 값 할당 따라서 함수에서main
의 값에 영향을 미치지 않습니다. .포인터의 값이 복사되기 때문에 포인터가 가리키는 메모리에 액세스 할 수 있습니다. 만약
s
읽기 전용이 아닌 메모리를 가리키면 한 버퍼의 내용을 다른 버퍼로 복사 할 수 있습니다. 예를 들어,s = "hi";
대신 ,main
에서 , 진술char *s = "hello";
s
가있을 가능성이 높습니다 읽기 전용 버퍼를 가리 킵니다. 쓰기 가능한 버퍼로 만들려면s
를 선언하십시오. 대신 배열로 :포인터가 아닌 포인터 값을 변경하려면
main
를 포함하는 메모리의 주소를 전달해야합니다s
의 버전 : 포인터에 대한 포인터. 다음과 같이 보일 것입니다 :또 다른 (아마도이 맥락에서 더 나은) 방법은 입력 및 출력 모두에 매개 변수 대신 반환 값을 사용하는 것입니다.