2018年9月21日 星期五

[C] 指標與array


指標重要觀念與口訣:(引用)
1.什麼"資料型態(data type)"就存什麼樣的"型態資料"。因此指標變數就是存記憶體位址
2.若宣告了一個指標變數時,就代表其資料型態是指標類型,因此這個變數存的內容就是記憶體,不管他本身原本是什麼型態,只要在程式理面使用該變數(不額外加符號),就是使用他的記憶體。就是上面強調的「什麼型態存什麼資料」。
3.指標(pointer) - 這個符號只有在宣告的時候才會出現,表示該變數是指標型態,其存的內容就是記憶體位址;可以想像成是一個「」。
4.取運算子(Dereference operator) - 在宣告以外時所有出現在變數前的都是這種(當然不包含乘法),表示依照這個變數所存的地址,去取得該記憶體位址理面存的值;可以想像成是把該變數的鎖打開的「鑰匙」。
5.「 & : 取運算子(Address-of operator) - 取得某一變數本身存放的記憶體位址。
6.在使用指標之前,如果沒有進行記憶體配置的話,原則上初始值為NULL,要讓程式能動態配置一個記憶體,就必須使用malloc
在Linux man pages中,malloc 的原型為以下所示:void *malloc(size_t size); 

7.陣列與指標的轉換:
記憶體位址: &arr[i]    ==  ptr+i
變數值存取: arr[i]  ==  *(ptr+i)

* 稱之為 pointer to ... 
[] 稱之為 array n of ...
() 稱之為 function returning ...


char * abc;
為宣告一abc的字串指標 非動態字串存取使用方式
若要取得其長度 可用 int Length = strlen(abc) 取得其長度
若abc為char*使用sizeof的話 回傳的是字串指標的大小 則為4 不是正確的使用方式

char abc[5]="ABCDE";
宣告一字元陣列長度為64 可使用strlen取得
也可以使用sizeof (abc)/(abc[0]); 去取得其長度

strlen 不可使用在char以外的地方 如 uint8_t之類的


#include //
#include //
#include //strlen, 




[Strlen與sizeof的差別]
void main(void)
{
  int len, i;
  char chararray[10];
  len = strlen(chararray);
  printf("chararray_len=%d.\r\n", len);//chararray_len=3.

  int total_sizeof;
  total_sizeof = sizeof(chararray);
  printf("total_sizeof=%d.\r\n", total_sizeof);//One char equal with 1 byte. total_sizeof=10.

  char a[] = "string";
  len = sizeof(a);
  for(i = 0; i<=len-1;i++)
  {
    printf("a[%d]=%c.\r\n",i, a[i]);
  }
  printf("chararray_len a=%d.\n", len);//size = 7.

  char *p = "string";
  len = sizeof(p);
  for(i = 0; i<=len-1;i++)
  {
    printf("p[%d]=%c.\r\n",i, p[i]);
  }
  printf("chararray_len p=%d.\n", len);//size = 8. 7+1 (\0)
}

[運用strncpy防止爆掉]
#include 

int main(void) {
  char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
  char dst[10]; /* not enough for all of src */

  strcpy(dst, src); /* BANG!!! */
  strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
      dst[9] = '\0';
  return 0;
}

[回傳char array給一call function]
方法1.運用sprintf動態傳值取值
char* getPwd()
{
     char* name="abc";
     return name;
}

void main(char* pwd)
{
    int len;
    len = sprintf(pwd, "%s", getPwd());
}

方法2.for迴圈array賦予
void testfunc(char* input_data){
  char str[10];
  for(int i=0; i < 10; ++i){
    input_data[i] = str[i];
  }
}




 

1 則留言: