안드로이드 스튜디오 (JNI) C++ 포인터 정리
C++ 포인터형
C++ 포인터 형식 변화 예
C++ 포인터 형식 변환 예
int a;
C++ 포인터 값 참조 예(위는 포인터의 주소에 들어가 있는 값 더하기)
int abits;
int *apBitAddr;
C++ 포인터 값 참조 예(위는 포인터의 주소에 들어가 있는 값 대입하기)
포인터에 지정된 변수(주소)에 더하기 빼기 예)
C++ 포인터에 설정된 주소의 변수값 1 더하기
1 빼기
za 값 더하기
xor 하기
포인터 입출력시
int *aMapTop;
int theSize;
b=*(aMapTop+theSize)
위 같은 경우는 aMapTop 포인터 위치에 theSize 길이만큼
포인터 주소를 증가해서
b에 값을 입력 한다는 뜻입니다.
(theSize 는 aMapTop 포인트 형식에 따라 증가합니다.
char 이면 1 바이트
short 면 2 바이트
int 면 4 바이트
unsigned long 면 8바이트)
b=(*aMapTop+theSize)
위 같은 경우는 *aMapTop 포인터 주소에 있는 값을 읽어 + theSize
값을 더 해서
b에 값을 입력 한다는 뜻입니다.
char *apBmpaddr;
char *arr1;
int zsize;
apBmpaddr=arr1+zsize;
C++ 포인터 주소 설정 예
char 형 arr1 포인터 주소에 + zsize 바이트 크기 만큼 포인터 위치 이동
* arr1 포인터가 char 형이라 zsize 만큼 이동 합니다.
만일 arr1 포인터가 short, int 형 이라면 형에 해당하는 만큼
곱해저서 증가하게 됩니다.
char 형 포인터는 = + zsize 만큼
short 형 포인트는 = +(zsize * 2) 만큼
int 형 포인트는 = +(zsize * 4) 만큼
구조체형 포인트는 = +(zsize * 구조체 크기) 만큼
더 증가하게 됩니다.
C++ 포인터 변환 주소 설정 예
int cg 길이만큼 주소가 추가된건 *need 가 char 형이라는데 주의.
int a;
int *ap;
ap=&a; //ap를 a변수 주소로 설정, *ap=123 은 a=123 과 같음
C++ 포인터에 변수 위치 지정 예
C++ integer 주소 값을 포인터에 설정 예,
C++ 포인터 주소 integer로 받기 예
int aa=(uintptr_t)ip; 형식 으로 사용해도 됩니다.
* 안드로이드 스튜디오에서 C++로 포인터를 다룰때
스마트폰이 32비트면 포인터가 4바이트
스마트폰이 64비트면 포인터가 8바이트로
자동 설정되니 주의가 필요합니다.
특히 구조체에(struct) 데이터 형과 포인터가
같이 설정 된 경우 포인터의 크기가 변해
구조체 크기도 변해서 오류가 날수 있습니다.
64비트 스마트폰에서 소스가 컴파일 되어 실행 될 경우
구조체가 int형으로 잘 배열 되지 않았을 경우,
패딩이 생겨 구조체 크기가 변하는 경우도 생기니 주의 해야 합니다.
32비트 스마트폰과 64비트 스마트폰의 호환을 위해서
버퍼 주소를 정수로 다룰 경우는 unsigned long을 사용해야 합니다.
참고로 자바에서 설정한 DirectByteBuffer 는
64비트 스마트 폰에서 실행해도 32bit 영역에서
버퍼를 잡아서 주소가 32비트를 넘어가지 않는것 같습니다.
64비트 스마트 폰에서 32비트 주소 포인터를 사용해도 오류가
나지 않았기 때문입니다.
C++의 malloc로 버퍼를 잡았을 경우는 64비트 스마트 폰이면
64비트 메모리 영역에서 버퍼를 잡는것 같습니다.
32bit 포인트를 사용했을 경우 오류가 발생 합니다
C++ 에선(JNI) int 변수로 char이나 short 형 등,
다른 형의 포인터에서 값을 읽을 때,
int 변수 사이즈가 포인터 데이터형 보다 클때
int 변수의 나머지 빈 공간에 ff를 자동 입력 합니다
예)
char *cp;
int a;
a=*cp; //a=0x(ff) (ff) (ff) (*cp) 값 처럼 됨
a=*cp & 0x000000ff; //이런식으로 입력되야 정상적으로 입력 됩니다.
델파이 같은 경우는 다른 형의 포인터에서 데이터를 읽을 때
0xff 가 아니라 00을 입력되서 아무 생각 없이 사용할 수 있었습니다.
처음 이걸 몰라 델파이 소스를 JNI C++ 옮기면서 오동작으로 무척 고생했습니다.
- *c++에서 변수와 포인터를 unsigned int , unsigned char... 형 등으로 설정하면
& 0xff 없이도 올바른 값이입력 됩니다.~휴
다른 형의 포인터에 다른 크기의 변수를 입력 하거나 받기
char 형 포인터에서 int 형 변수 값을 읽고 쓰는법 예제 입니다.
char 형 포인터에서 int 변수로 읽기
char 형 포인터에서 int 변수로 쓰기
안드로이드 스튜디오 (JNI) C++ 포인터 정리
'프로그램잉_기타 > 안드로이드 스튜디오' 카테고리의 다른 글
안드로이드 스튜디오 단축키 (0) | 2021.02.27 |
---|---|
안드로이드 스튜디오 caused by: java.lang.assertionerror: could not delete caches 에러 (0) | 2020.12.08 |
안드로이드 스튜디오 설치 방법 (0) | 2020.12.03 |
안드로이드 스튜디오 코틀린 ? , !! , null 간단 설명 (0) | 2020.12.01 |
안드로이드 스튜디오 The file name must end with xml. 오류 (0) | 2020.11.30 |