Showing posts with label C語言. Show all posts
Showing posts with label C語言. Show all posts

Wednesday, June 26, 2013

An 'array' with 5 elements which is a pointer

期望印出Array[5]中的數值:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int n =5;
 int *Array,*aptr;
 
 Array = (int*)malloc(n*sizeof(int));
 memset(Array,0,5);
 aptr = Array;
 for(n = 0; n < 5; n++)
 {
  *aptr = n;
  aptr++;
 }
 aptr = &Array[0];
 for(n = 0; n < 5; n++)
 { 
  printf("show array vaule = [%d]\n", (*aptr)++; 
 }
  free(Array); 
  system("PAUSE"); 
  return 0;
}

Result of this program.
上例中乍看是正確的輸出Array中的值但是其實不然,請看下例解釋:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int n =5;
 int *Array,*aptr;
 
 Array = (int*)malloc(n*sizeof(int));
 memset(Array,0,5);
 aptr = Array;
 for(n = 0; n < 5; n++)
 {
  *aptr = n*2;
  aptr++;
 }
 aptr = &Array[0];
 for(n = 0; n < 5; n++)
 { 
   printf("show array vaule = [%d]\n", (*aptr)++; 
 }
  free(Array); 
  system("PAUSE"); 
  return 0;
}

上例中我們期望可以列印出Array中的值[0][2][4][6][8],但是列印出來的值卻是[0][1][2][3][4]。這是因為(*aptr)++是針對Array[0]裡面的值先輸出在遞增,而不是改變pointer的位址。

那要如何列印出Array中的值[0][2][4][6][8]請看下例:



#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int n =5;
 int *Array,*aptr;
  
 Array = (int*)malloc(n*sizeof(int));
 memset(Array,0,5);
 aptr = Array;
 for(n = 0; n < 5; n++)
 {
  *aptr = n*2;
  aptr++;
 }
 aptr = &Array[0];
 for(n = 0; n < 5; n++)
 {   
  printf("show array vaule = [%d]\n", *aptr++; 
 }
  free(Array); 
  system("PAUSE"); 
  return 0;
}


取消括號以後才是對aptr位址做增加,順利得到我們要的值。

接下來再嘗試將++換到aptr前面看看會發生甚麼事情。


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int n =5;
 int *Array,*aptr;
  
 Array = (int*)malloc(n*sizeof(int));
 memset(Array,0,5);
 aptr = Array;
 for(n = 0; n < 5; n++)
 {
  *aptr = n*2;
  aptr++;
 }
 aptr = &Array[0];
 for(n = 0; n < 5; n++)
 {   
  printf("show array vaule = [%d]\n", ++*aptr); 
 }
  free(Array); 
  system("PAUSE"); 
  return 0;
}


將程式改成++*aptr,代表Array[0]裡面的值先做遞增再輸出,測試結果列印出來為[1][2][3][4][5]。

另外如果加上括號++(*aptr),測試輸出結果列印出來與上例相同。: