본문 바로가기

Windows

C pointer에 관하여

반응형

C에서 어려운 부분이 ponter입니다.

특히 dimension과 같이 사용할 때 어려운 점이 많습니다.

MISRA C_2012 Guidelines for the use of the C language in critical systems에서는 pointer로 선언했을 경우 dimension 보다는 pointer를 사용하라고 합니다.

아래의 예제는 dimension을 선언하였을 때 사용하는 방법입니다.

void pointer_test(double *vdst, int stride_dst, const double* vsrc, int stride_src, int n)
{
	int i;
	if (stride_dst != 1 || stride_src != 1)
	{
		/*
		 * general unoptimized case
		 */
		for (i = 0; i < n; i++, vdst += stride_dst, vsrc += stride_src)
			*vdst = *vsrc;
	}
	else
	{
		/*
		 * optimized case
		 */
		int n2 = n / 2;
		for (i = 0; i < n2; i++, vdst += 2, vsrc += 2)
		{
			vdst[0] = vsrc[0];
			vdst[1] = vsrc[1];
		}
		if (n % 2 != 0)
			vdst[0] = vsrc[0];
	}
}

int main(int argc, char **argv)
{
	int i, j;
	double pp_double[10][10];
	double p_double[10];

	for (i = 0; i < 10; i++) {
		for (j = 0; j < 10; j++) {
			pp_double[i][j] = (j + i * 10);
		}
		p_double[i] = i;
	}

	for (i = 0; i <= 10; i++)
	{
		pointer_test(&pp_double[i][0], 1, &p_double[0], 1, 10);
	}
}

이것을 pointer로 사용하는 경우에는 다음과 같습니다.

void pointer_test(double *vdst, int stride_dst, const double* vsrc, int stride_src, int n)
{
	int i;
	if (stride_dst != 1 || stride_src != 1)
	{
		/*
		 * general unoptimized case
		 */
		for (i = 0; i < n; i++, vdst += stride_dst, vsrc += stride_src)
			*vdst = *vsrc;
	}
	else
	{
		/*
		 * optimized case
		 */
		int n2 = n / 2;
		for (i = 0; i < n2; i++, vdst += 2, vsrc += 2)
		{
			vdst[0] = vsrc[0];
			vdst[1] = vsrc[1];
		}
		if (n % 2 != 0)
			vdst[0] = vsrc[0];
	}
}

int main(int argc, char **argv)
{
    int i, j;
    double **pp_double;
    double *p_double;
 
    pp_double = new double[10];
    p_double = new double[10];
 
    for(i = 0; i < 10; i++) {
    	pp_double[i] = new double[10];
    }
 
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 10; j++) {
			*(*(pp_double + i) + j)) = (j + i * 10);
		}
		*(p_double + i) = i;
	}

	for (i = 0; i <= 10; i++)
	{
		pointer_test((*(pp_double + i) + 0), 1, p_double, 1, 10);
	}
}

코드를 비교해 보시면 아시겠지만 다시 한번 써보면 dimension의 경우

p_double[i] = i;

*(p_double + i) = i;

두 코드는 같습니다.

또한

&p_double[i] 와 (p_double + i) 도 같습니다. (주소를 참조하는 경우 입니다.)

 

2차 dimension의 경우

pp_double[i][j] = ( j + i * 10);

*(*(pp_double + i) + j) = (j + i * 10);

이 두 코드도 동일합니다.

주소를 참조하는 경우

&pp_double[i][j] 는 (*(pp_double + i) + j) 와 같습니다.

 

위의 두 예제를 디버깅 해 보시기 바랍니다.

 

반응형