C---數組相關常見的坑(字符數組、字符指針、strcpy與=區別)

學了一段時間數組、指針、地址等相關知識,感覺自己算入門了,其實發現距離入門還差18條鴻溝,還得繼續努力才能入門!

1.數組名的指向不可改變

數組名的指向不可以改變(指向的地址不能改變),但此地址的值,是可以改變的!

#include <stdio.h>


int main() {

	char ps[6] = { 'h', 'e', 'l', 'l', 'o' };		// 等價於:char ps[6] = "hello";
	//ps = "abcd";			// ??爲什麼不行呢?
	strcpy(ps, "abcd");		// 爲什麼可以呢?
	printf("%c", ps[1]);

}

  • 因爲數組在初始化的時候,就確定了指向具體內存的地址,數組名 & 內存地址都深度綁定的,不能再修改了!
  • 雖然地址不能修改,但是地址內的值是可以修改的,上述代碼中,ps[0] = ‘m’,(單引號,代表裏面是字符)類似這樣是可以的。
  • ps = “abcd”,這個是不行的。因爲char ps[6] = { ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ };裏面,{ ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ }存儲在了常量內存中,而ps存儲在棧內存中,初始化的時候就深度綁定了,無法再修改內存指向。而ps = “abcd"相當於在常量內存中,再找個空間存儲"abcd”,然後讓ps指向這塊內存,所以最終無法編譯通過。
  • strcpy(ps, “abcd”),這個之所以可以,是因爲strcpy的本質是:通過字符指針修改的內容。C—爲什麼不能向函數傳遞一個數組。在原始常量區地址修改值,而不是新建一塊內存空間去初始化。(strcpy的詳情如下)

2.strcpy的使用詳情:

以下內容,來源:
https://www.cnblogs.com/ngnetboy/archive/2012/11/19/2777384.html


char *strcpy(char *dest, const char *src)

參數:

  • dest – 指向用於存儲複製內容的目標數組
  • src – 要複製的字符串,要麼是字符指針常量、要麼是數組常量

返回值:

  • 該函數返回一個指向最終的目標字符串 dest 的指針。

strcpy()的常規用法:(重點不在這邊!)

#include<stdio.h>
#include<string.h>
#define MAX 20

int main(void)
{
    char a[MAX]="abc";
    char b[MAX]="abcdefghi";		
    strcpy(a,b);			
    puts(a);
    puts(b);
}

abcdefghi
abcdefghi



3.字符指針與strcpy的特殊用法:

#include <stdio.h>
#include <string.h>
#define MAX 20

int main(void) {

	char* pc = "hello";
	printf("%p   \n", pc);
	pc = "abcd";
	printf("%p   \n", pc);

	//pc[0] = 'm';				// 爲什麼不行,編譯顯示沒有讀寫權限
	//printf("%c   \n", pc[0]);

}


00A07D48
00A07C10

  • 如上pc爲字符指針,指針的指向是可以改變的(指針的值可以改變),所以最終pc的值發生了改變。
  • 但根據指針pc,去修改指向內存的值,是不行的!其實,char* pc = "hello"等價於:const char * pc = “hello”.說明這是一個數組指針常量,首先是個常量,其次纔是數組指針,說明不能用 *指針修改指針所指向的值。
  • 有關指針常量、常量指針,可以參考博文:

strcpy()的特殊用法:


#include <stdio.h>
#include <string.h>
#define MAX 40

int main(void) {
	char* a = "beast";
	char b[MAX] = "you are the beast one.";
	char* p;
	p = strcpy(b + 8, a);		// a是字符指針常量,a
	puts(a);
	puts(b);
	puts(p);
}

beast
you are beast
beast

strcpy函數的功能:

  • 將一個字符串複製到另一個字符串。這個代碼無疑是把字符串a複製到b的第八個位置之後
  • 字符串最後一個字節存放的是一個空字符——“\0”,用來表示字符串的結束。把a複製到b之後會令a的空字符把複製後的字符串隔斷,所以會顯示到beast就會結束。
  • p指針爲什麼顯示爲beast?因爲strcpy函數最終返回的是b+8這個地址的指針,指針目前指向b+8這個位置,且b+8之後的內容都被a覆蓋了,所以b+8這個地方,只保留beast內容了!
  • strcpy是通過常量的指針,或常量本身,或數組名、可以改變某個指針所指向的值!
  • = 是直接對某個變量改變值。但是容易遇到指針常量(*p = “alien”)或數組名修改指向(char ps[6] = { ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ })的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章