C語言中Pointer, Array,String and Structures的區別

PeaceTree發表於2018-06-10



指標(pointer )

Tasks, such as dynamic memory allocation, cannot be performed without using pointers. 

Every variable is a memory location and every memory location has its address defined which can be accessed using ampersand (&) operator, which denotes an address in memory. 

pointer is a variable whose value is the address of another variable, i.e., direct address of the memory location. Like any variable or constant, you must declare a pointer before using it to store any variable address.

Access the value at the address available in the pointer variable. using unary operator * 


字串(string)

用雙引號引起來的就是字串

"a string"

// C語言編譯器會將兩個並列的字串自動拼接成一個字串

"a string""another a string"

// 折行符'\'是程式碼換行連線的標記(一行不夠寫)

"a looooooooooong \

 string

常見ASCII編碼:

  'A' == 65    'a' == 97    '0' == 48    '\0' == 0

int a[10]; //表示在棧中分配了40Bytes的記憶體空間,空間的首地址是a

char a[10]; //表示在棧中分配了10Bytes的記憶體空間,空間的首地址是a


如何表示和儲存字串:

    C語言中沒有字串型別用一片記憶體空間儲存一串字元,約定用整數0(或字元'\0')來表示一個字串的結束

    使用字串時只需要記錄字串的開始位置。

C語言中的字串用字元陣列表示:

char a[6] = {'h','e','l','l','o','\0'};//特殊的字元陣列(字串)

char a[6] = "hello"; //簡化版寫法(這種寫法 \0省略)

char *a = "hello"; //定義一個字串的另一種寫法


初始化

char str[] = "hello"; //常用

char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};

// 部分初始化, 部分初始化中, 沒有被初始化的元素預設是0 (\0對應的ASCII 0)

char str[8] =  {'h', 'e', 'l', 'l', 'o'}; // hello000

char str[5] = {'h', 'e', 'l', 'l', 'o'}; //該方式不是字串, 而是字元陣列, 因為沒有\0

char str[] = {'h', 'e', 'l', 'l', 'o'}; //同上,是字元陣列
" "; //包含一個空格

""; //空字串,什麼東西都沒有

字串的賦值

  • 給 char* 型別的字串賦值,可以直接使用 "=" 號
  • 給 char[] 型別的字串賦值,需要使用 strcpy 函式

字串的特點

  • 需要明白的一點就是字串以\0結尾, 沒有\0就不是字串
  • 只要是用雙引號括起來的都是字串
  • 字串的本質就是陣列(字元陣列)

輸出

 %s的原理, 從傳入的"地址"開始逐個取出, 直到遇到"\0"位置   

 如何輸出字串:

  1. 使用printf的%s佔位符來輸出
  2. 使用puts函式來輸出(自動換行,原樣輸出)
char str[] = "how are you";

printf("%s\n", str); //how are you

puts(str); //how are you

輸入


1. 利用scanf()函式接收字串



2. 利用gets()函式接收字串



3. 利用fgets()函式接收字串(常用)


/** 給字元陣列賦值的三種方式 */

#include <stdio.h>

#include <string.h>

void mystrcpy(char *str1, const char *str2) {

    //*str2對*str1逐個字元進行賦值

    //*str2直到把'\0'賦值給*str1時,*str1的結果就是0,迴圈就結束!

    while ((*str1++ = *str2++));

}

int main() {

    char str[10] = "abc";

//1.使用迴圈給字元陣列賦值

    for (int i = 0; i < 10; i++) {

        str[i] = "ABC"[i]; //等價於 *("ABC"+i),"ABC"返回的是A的地址(即首地址)

    }

    printf("str = %s\n", str);//str = ABC

//2.使用標準庫函式給字元陣列賦值

    strcpy(str, "XYZ");

    printf("str = %s\n", str);//str = XYZ

//3.使用自定義函式給字元陣列賦值

    mystrcpy(str, "OKOK");

    printf("str = %s\n", str);//str = OKOK

    return 0;

}


庫函式

  • 計算字串的長度strlen計算字串中有多少個字元,注意不包括\0

    strlen的原理:從傳入的地址開始逐個取出字串,每取出一個就讓計數器+1.直到遇到\0為止。



  • 字串拼接strcat

    原理:首先遍歷第一個字串,直到遇到\0為止,然後取出第二個字串中的字元,\0的位置開始新增,新增完畢之後再在最後新增一個\0

strcat的引數只有兩個,字串1,和想要拼接的字串2


  • 字串拷貝strcpy

    strcpy函式會將源的資料拷貝到目標中,並且會覆蓋掉目標中原有的資料目標的容積必須能夠存放拷貝的資料如果容積不夠會報錯


  • 字串比較(strcmp

 原理取出字串中的每一個字元進行逐個比較如果發現不相等就不會繼續往下比較

相等返回0

#include <stdio.h>

#include <string.h>

#include <stdbool.h>

/** strcpy 字串賦值函式 */

void test1() {

    char str[6]={0};//表示在棧中分配了6個位元組的記憶體空間,空間的首地址是str(陣列名)

    strcpy(str, "abc");//給字元陣列賦值,str[10] = "abc";

    strncpy(str, "AABBCC", sizeof(str)-2);//只賦值前4個字元(AABB);str[6] = "AABB";

}

/** strcat 給一個字串追加內容 */

void test2() {

    char str[8] = "abc";

    strcat(str, "def"); //str[8] = "abcdef";

    strncat(str, "kkkkkk", 3);//只追加前3個字元; str[8] = "abckkk";

}

/** strcmp 比較字串內容的大小 */

void test3() {

    char *str1 = "abcd.c";

    char *str2 = "abcf.m";

    strcmp(str1, str2); //返回值為: -2 (表示 str1 < str2)

    strncmp(str1, str2, 3); //比較前3個字元的大小; 返回值為: 0 (表示 str1 == str2)

    bool r = str1 > str2;//比較地址大小(str1和str2都是地址)

}

/** memset 記憶體清理函式(清空) */

void test4() {

    char str[8] = "abcd";

    memset(str, 0, sizeof(str));//清理記憶體空間(開始位置, 清零, 空間大小/長度);

    strcpy(str, "ABCD");//清空後重新賦值

    printf("str = %s\n", str);

}

int main() {

    test4();

    return 0;

}

#include<stdio.h>
#include<string.h>
#include<stdbool.h>

int main()
{
float b;
float a;
a=0;
b=0;
char str1[7]="abceee";
char *str2 = "abcddd";
a = strcmp(str1,str2);
b = strncmp(str1,str2,3);  /*using strncmp比較具體數值的字串*/
printf("%f\n%f", b,a);
return 0;
}

strcmp實際應用於登入密碼!!!!

//strcmp函式實際應用(判斷字串是否相等),驗證登入密碼!
#include <stdio.h>
#include <string.h>
int main() {
    char pwd[20] = {0};
    do {
        printf("請輸入密碼:");
        scanf("%s", pwd);
    } while (strcmp(pwd, "abc123"));
    printf("密碼正確,登入成功!\n");
    return 0;
}

指標變數本身在棧中,指標變數可以指向任何地方。(指標和指標指向的空間是兩個空間)

指標修改值的兩種情況:

1)修改指標本身的值(也就是改變指標的指向) ;

2)修改指標所指向的空間的值



字串陣列

 字串陣列:一個陣列中的所有的元素都是字串。  

  如果想儲存一堆字串那麼可以使用字串陣列,說白了字串陣列就是二維陣列

  字串陣列兩種表示:

    第一種:char str[4][6] = {"aaa", "bbb", "ccc"}; //char型別的二維陣列

    第二種:char *str[4] = {"aaa", "bbb", "ccc"}; //char*型別的一維陣列


應用




相關文章