2012-10-23 2 views
1

내 질문은 간단하다 :char에 대한 포인터의 lvalue가 증가합니까?

char *chrptr = "junk"; 

*chrptrj 가리 할 당시 상상 :

당신이 말해봐. 현재 문자 j을 다음 문자로 증가시키는 방법이 있습니까?이 경우 k일까요? 나는 다음 캐릭터로 가고 싶지 않다. 나는 현재의 캐릭터를 증가시키고 싶다.

저는 C에서 새로 왔으며 시도한 바는 (*chrptr)++입니다.

답변

1

역 참조 연산자 *을 사용하여 포인터를 다시 참조 할 필요가 없습니다.

메모리의 문자 포인터를 앞으로 이동 시키려면 간단히 chrptr++을 입력하면됩니다.

업데이트

당신은 문자를 검색하는 주위에 while 루프를 포장 할 수 있습니다.

char *chrptr = "junk"; 
char search = 'k'; 

while (*chrptr) { 
    if (*chrptr == search) 
    printf("%c\n", *chrptr); 
    chtptr++; 
} 
+0

죄송합니다, 제 예제는 정말 나빴습니다. 그것은 내가 의미했던 것이 아닙니다. 제 견본을 읽으십시오. – user1661781

3

문자열을 수정하고 상수 문자열로 지정할 수없는 것처럼 보이지만 실제로는 동작이 정의되지 않습니다. 그래서 당신은 문자의 상수가 아닌 배열에 정의를 변경해야합니다

//This initializes a 5 element array including the null byte at the end 
char chrptr[] = "junk"; 
//now you can modify that 
chrptr[0]++; 
//or equivalently 
chrptr[0] +=1; 
chrptr[0] = chrptr[0]+1; 
+0

그래도 그 구문을 사용하지 않을 것입니다. 일반적으로 보이는 것이 아니기 때문에 독자를 혼란스럽게 할뿐입니다. 내 생각에 더 좋은 방법은'chrptr [0] = chrptr [0] +1;'이라고 쓰면 동일한 기계어가된다. – Lundin

+1

저는 다른 몇 가지를 추가했습니다.하지만 드문 일이 아니며 IMHO가 가장 간결한 형식입니다. – iabdalkader

+0

@ Lundin 왜 chrptr [0]을 두 번 말하고 싶습니까? 'anything + = 1'은 "1만큼 증분"이라고 읽습니다. 언뜻 보면 매우 이해할 수 있습니다. – Kos

2
char *chrptr = "junk"; 

이 코드는 정말 좋지 않다. "쓰레기"와 같은 문자열 리터럴은 읽기 전용 메모리에 대한 포인터입니다. 당신은 그들을 수정하지 않아야합니다. 그러니 말 :

const char* chrptr = "junk"; // pointer to a const; no modifications 

또는 (귀하의 경우) : 이것은 "쓰레기"(플러스 null 종결)로 초기화, 스택에 문자의 5 요소 배열을 생성

char chrArray[] = "junk"; 

. 이제 당신은 그것을 자유롭게 변경할 수있어 :

chrArray[0] ++; 
(*chrArray) ++; 

(일부 남은 발언)

전 C에 새로운 해요,하지만 같은 (* chrptr) ++ 돈과 같은 것들 일하지 마라.

그들 do가 다르다. 이 부분을합시다 :

  • chrptr은 char-to-char 유형의 값입니다.
  • *chrptr은 포인터가 참조 해제 되었기 때문에 char 유형의 값입니다.

이 모두가 "L-값"(= 실제 객체) 될 일이, 그래서 당신이 그들을 수정할 수 있습니다

  • ++ chrptr이 하나 포인터를 증가 (= 앞으로 포인터를 하나 개의 객체를 전진)
  • ++ *chrptr은 char을 1 씩 증가시킵니다 (= 'a''b'로 변경). 문자열이 메모리의 읽기 전용 섹션에 있었기 때문에

(전, ++*chrptr 당신을 위해 작동하지 않았다. 당신이 const char*하지 char*를 사용하여 지적했다면, 예기치 않은 대신 도움이 컴파일 오류를 얻을 것 . 런타임 동작)


또한주의 :

간단한 문장의 경우, ++*chrptr;(*chrptr)++;에 해당합니다. 연산자 순서는 중요합니다 (역 참조, 증분).

OTOH, *chrptr++operator precedence 때문에 증분 - 역외 참조입니다. 우선 순위가 확실하지 않은 경우 괄호를 추가하십시오.

+0

오, 편집을 보았습니다. 나 확장하자, 너의 문제는 뭔가 다른거야. – Kos

+0

그래, 내 예제는 정말 나빴어. 심하게 말로 된 질문을하여 시간을 낭비하게해서 죄송합니다. – user1661781

+0

걱정하지 마십시오. 완료, 수정 내용보기 – Kos

1

참조 (* chrptr) ++; 잘 작동하지만 이것은 chrptr이 가리키는 배열의 첫 문자를 증가시킵니다. 다음과 같은 문을 사용하는 경우

char * chrptr = "junk";

여기서 chrptr은 (* chrptr) ++를 사용하여 const char 배열을 가리키고 있습니다. 문자열의 변경 사항을 반영하지 않고 증가합니다.

그러나이 방법으로 같은 코드를 사용하는 경우 (http://codepad.org/FJMB1ryv) : -

#include<iostream> 

using namespace std; 

int main() 
{ 
char a[]="yogendra"; 
char *y=a;//(char*)"junk"; 
(*y)++; 
cout<<y<<endl; 
return 0; 
} 

당신 (* Y) ++이 당신을 도울 것입니다 work.Hoping됩니다. 행운을 빌어 요.

관련 문제