今天做作業時,發現下列一個問題。
首頁是這個自編的strncpy函數:
#include "ctype.h" #include "stdlib.h" #include "string.h" #include "windows.h" int main() { char *strata(char s1[],char s2[],int n); char nam1[41]="das"; char nam2[41]="wo shi yi ge da sha bi"; strata(nam1,nam2,4); puts(nam1); system("pause"); return 0; } char *strata(char s1[],char s2[],int n) { int i; char *prt=s1; if(n>strlen(s2)) return "-1"; else { s2[n]='\0'; for(i=0;i<n;i++) s1[i]=s2[i]; } }
之前一下子忘記:實參中傳入的是數組的地址。
所以主函數中S1,S2的地址被傳入strata函數的s1,s2中
然後一直在糾結字符串與地址的關系,慢慢發現char *prt=s1;
字符串可以賦值給地址的問題:
對於語句 char *a="hello";
對於這個聲明方式,會造成的誤解是:聲明了一個字符指針(它會指向一個位置),將“字符串”賦值給 指針表達式"*a"所指向的地址。但正解是:聲明了一個字符指針後,並用字符串常量的第一個字符的地址賦值給指針變量a。即正確順序是:1.分配內存給字符指針;2.分配內存給字符串;3.將字符串首地址賦值給字符指針; 這裡有兩點需要考慮清楚的地方:①*a只是指向一個字符。舉例如下:
[c++] view plaincopyprint?② 若字符串常量出現在在表達式中,代表的值為該字符串常量的第一個字符的地址。所以”hello”僅僅代表的是其地址。
C中沒有字符串變量,所以在存放字符串常量時一般采用字符數組來存儲。
數組是一個連續的存儲空間,這裡記錄著兩個重要的量:首地址和空間大小。
而指針不關心其長度,只要記錄下首地址就OK。
char *a;//申請空間地址
a=“hello”;//a指向‘h’,並且內存開辟。
為方便理解,一些地方可以把地址/指針和字符串“等價”,地址/指針所指向的變量是字符串的首個字符。
如有更好的理解,希望大家來點評