C語言中Pointer, Array,String and Structures的區別
指標(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.
A 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"位置
如何輸出字串:
- 使用printf的%s佔位符來輸出
- 使用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*型別的一維陣列
應用
相關文章
- C語言中指標, 陣列和字串(Pointer, Array and String in C Programming Language)C語言指標陣列字串
- C語言中&&,||,&,| 的區別C語言
- C語言中的strlen與sizeof的區別C語言
- C語言中const和#define的區別C語言
- C語言中pi=&j和*pi=j的區別C語言
- C語言中的資料型別C語言資料型別
- c語言中的變數儲存區域C語言變數
- C++語言中std::array的神奇用法總結,你需要知道!C++
- C#中String和string區別C#
- c語言中陣列的三種型別C語言陣列型別
- 輸出C語言中 變數的型別C語言變數型別
- C: (pointer) 陣列變數和指標的區別陣列變數指標
- c 語言中巨集定義和定義全域性變數的區別變數
- c語言中陣列的宣告喝初始化的區別和聯絡C語言陣列
- C語言中的#和##C語言
- C語言中迴圈語句while 中判斷條件出現 || 和 && 的區別C語言While
- Python語言中/與//的區別是什麼?Python
- Null pointer (NULL array pointer is passed) in function cvGetMat, 報這樣的錯NullFunction
- c語言中的&的用法C語言
- opencv遇到NULL pointer(NULL array pointer is passed) 解決方案OpenCVNull
- C系列語言中.c&&.h檔案內容的區分
- C語言中宏定義都有那些盲區?C語言
- C語言中sync()C語言
- C語言中有C語言
- Python語言中=和==有什麼區別?Python
- Swift語言中class、struct、enum的聯絡與區別SwiftStruct
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- C語言中資料型別的自動型別轉換C語言資料型別
- Array()與Array.of()方法區別
- c語言中預設引數的兩種型別C語言型別
- 對C語言中無符號型別的建議C語言符號型別
- c語言中 *p++ 和 (*p)++ 有什麼區別?以及C語言運算子的優先順序。整理。C語言
- 【C】 30_C語言中的字串C語言字串
- 解析java語言中String方法之indexOfJavaIndex
- python語言中類和函式的作用及區別!Python函式
- C語言_瞭解一下C語言中的四種儲存類別C語言