程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 地址/指針和字符串,地址/指針字符串

地址/指針和字符串,地址/指針字符串

編輯:關於C語言

地址/指針和字符串,地址/指針字符串


今天做作業時,發現下列一個問題。

首頁是這個自編的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?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main(void){  
  5.     char *a="bcd";  
  6.     printf("輸出字符:%c /n", *a);  /*輸出字符,使用"%c"*/<br>    printf("輸出字符:%c /n", *(a+1) );  /*輸出字符,使用"%c"*/  
  7.     printf("輸出字符串:%s /n", a); /*輸出字符串,使用"%s";而且a之前不能有星號"*"  */   
  8.     system("pause");  /*為了能看到輸出結果*/  
  9. }  
  10. /*運行結果如下: 
  11. 輸出字符:b<br>輸出字符:c 
  12. 輸出字符串:bcd*/  

        若字符串常量出現在在表達式中,代表的值為該字符串常量的第一個字符的地址。所以”hello”僅僅代表的是其地址。           

      

 
  1. char *a;  
  2. a="hello";/*這裡字符串"hello"僅僅代表其第一個字符的地址*/  

   C中沒有字符串變量,所以在存放字符串常量時一般采用字符數組來存儲。 
     數組是一個連續的存儲空間,這裡記錄著兩個重要的量:首地址和空間大小。
    而指針不關心其長度,只要記錄下首地址就OK。

    char *a;//申請空間地址
    a=“hello”;//a指向‘h’,並且內存開辟。
     為方便理解,一些地方可以把地址/指針和字符串“等價”,地址/指針所指向的變量是字符串的首個字符。

     如有更好的理解,希望大家來點評







 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved