標籤:style blog http io ar color os 使用 sp
原文:地址/指標和字串
今天做作業時,發現下列一個問題。
首頁是這個自編的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];}}
之前一下子忘記:實參中傳入的是數組的地址。
慢慢發現char *prt=s1;
數組名本身就是指標常量;
字串可以賦值給地址的問題:
對於語句 char *a="hello";
對於這個聲明方式,會造成的誤解是:聲明了一個字元指標(它會指向一個位置),將“字串”賦值給 指標運算式"*a"所指向的地址。但正解是:聲明了一個字元指標後,並用字串常量的第一個字元的地址賦值給指標變數a。即正確順序是:1.分配記憶體給字元指標;2.分配記憶體給字串;3.將字串首地址賦值給字元指標; 這裡有兩點需要考慮清楚的地方:①*a只是指向一個字元。舉例如下:
[c++] view plaincopyprint?
- #include <stdio.h>
- #include <stdlib.h>
-
- int main(void){
- char *a="bcd";
- printf("輸出字元:%c /n", *a); /*輸出字元,使用"%c"*/<br> printf("輸出字元:%c /n", *(a+1) ); /*輸出字元,使用"%c"*/
- printf("輸出字串:%s /n", a); /*輸出字串,使用"%s";而且a之前不能有星號"*" */
- system("pause"); /*為了能看到輸出結果*/
- }
- /*運行結果如下:
- 輸出字元:b<br>輸出字元:c
- 輸出字串:bcd*/
② 若字串常量出現在在運算式中,代表的值為該字串常量的第一個字元的地址。所以”hello”僅僅代表的是其地址。
- char *a;
- a="hello";/*這裡字串"hello"僅僅代表其第一個字元的地址*/
C中沒有字串變數,所以在存放字串常量時一般採用字元數組來儲存。
數組是一個連續的儲存空間,這裡記錄著兩個重要的量:首地址和空間大小。
而指標不關心其長度,只要記錄下首地址就OK。
char *a;//申請空間地址
a=“hello”;//a指向‘h’,並且記憶體開闢。
為方便理解,一些地方可以把地址/指標和字串“等價”,地址/指標所指向的變數是字串的首個字元。
如有更好的理解,希望大家來點評
地址/指標和字串