天天看點

C語言基礎---11.數組相關常見的坑(字元數組、字元指針、strcpy與=差別)

文章目錄

    • 1.數組名的指向不可改變
    • 2.strcpy的使用詳情:
    • 3.字元指針與strcpy的特殊用法:
學了一段時間數組、指針、位址等相關知識,感覺自己算入門了,其實發現距離入門還差18條鴻溝,還得繼續努力才能入門!

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

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

#include <stdio.h>


int main() {

	char ps[6] = { 'h', 'e', 'l', 'l', 'o' }; // 等價于:char ps[6] = "hello";
	printf("%s    \n", ps);
	strcpy(ps, "abcd"); 
	//ps = "abcd";			// 為什麼不行呢?
	printf("%s", ps);
}

           
hello
abcd			// ps的值為什麼又變為了abcd了?

           
  • 因為數組在初始化的時候,就确定了指向具體記憶體的位址,數組名 & 記憶體位址都深度綁定的,不能再修改了!
  • 雖然位址不能修改,但是位址内的值是可以修改的,上述代碼中,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”.說明這是一個數組指針常量,首先是個常量,其次才是數組指針,說明不能用 *指針修改指針所指向的值。
  • 有關指針常量、常量指針,可以參考博文:

    C—const、指針、數組、指針常量,常量指針等歸納總結

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’ })的問題。