10深入理解C指针之---指针运算和比较
該系列文章源于《深入理解C指針》的閱讀與理解,由于本人的見識和知識的欠缺可能有誤,還望大家批評指教。
指針運算有很多種,主要有指針的聲明*、指針的解引*、指針指向(*).或->、指針+、指針-、指針==、指針!=、指針>、指針>=、指針<、指針<=、指針轉換(數據類型)。
通過代碼:
1 #include <stdio.h>2 3 int main(int argc, char **argv)4 {5 char charVar; 6 short shortVar;7 int intVar;8 long longVar;9 float floatVar; 10 double doubleVar; 11 12 printf("不同數據類型的長度如下:\n"); 13 printf("數據類型\t\t長度(字節)\n"); 14 printf("char\t\t\t %d\n", sizeof(charVar)); 15 printf("short\t\t\t %d\n", sizeof(shortVar)); 16 printf("int\t\t\t %d\n", sizeof(intVar)); 17 printf("long\t\t\t %d\n", sizeof(longVar)); 18 printf("float\t\t\t %d\n", sizeof(floatVar)); 19 printf("double\t\t\t %d\n", sizeof(doubleVar)); 20 21 return 0; 22 }代碼結果:
不同數據類型的長度如下: 數據類型 長度(字節) char 1 short 2 int 4 long 8 float 4 double 8不同系統的基本數據類型可能稍微不同,請自己測試。知道自己系統的基本數據類型的大小之后,就可以繼續學習下面的內容了,指針的聲明和解引,前面已經學習過,下面主要進行其他部分。
一、指針指向->:用于訪問結構指針引用的字段內容,是(*).的簡化版本而已,
1、定義:可以通過指針方便快捷的訪問結構的字段,而且書寫更加簡單方便,可以減少兩次敲擊鍵盤的次數
2、特征:
1)、使用前需要聲明結構體
2)、使用前需要聲明結構體指針
3)、可以使用->指針指向訪問結構體指針的字段
4)、也可以使用(*).解引指針和成員運算符訪問結構體指針的字段
3、應用:
1)、結構體的聲明方式是非常多樣化的,不同的聲明方式,使用方式略有不同
2)、使用結構體指針需要先分配內存
3)、如果結構體中含有指針,需要二次分配內存
4)、如果結構體中含有指針,釋放內存順序與分配內存順序完全相反
代碼如下:代碼很簡單,仔細閱讀即可:
1 #include <stdio.h> 2 #include <string.h>3 #include <stdlib.h>4 5 int main(int argc, char **argv)6 {7 //結構體的普通聲明8 struct _person{9 char* firstName;10 char* lastName;11 char* title;12 int age;13 };14 struct _person* person1;15 person1 = (struct _person*)malloc(sizeof(struct _person));16 (*person1).firstName = (char*)malloc(sizeof(char) * 20);17 strcpy((*person1).firstName, "zhang");18 (*person1).lastName = (char*)malloc(sizeof(char) * 30);19 strcpy((*person1).lastName, "san");20 (*person1).title = (char*)malloc(sizeof(char) * 100);21 strcpy((*person1).title, "A");22 (*person1).age = 29;23 24 printf("The struct _person *person1 info:\n");25 printf("(*person1).firstName: %s\n", (*person1).firstName);26 printf("(*person1).lastName: %s\n", (*person1).lastName);27 printf("(*person1).title: %s\n", (*person1).title);28 printf("(*person1).age: %d\n", (*person1).age);29 30 free((*person1).firstName);31 free((*person1).lastName);32 free((*person1).title);33 free(person1);34 35 struct _person* person2;36 person2 = (struct _person*)malloc(sizeof(struct _person));37 person2->firstName = (char*)malloc(sizeof(char) * 20);38 strcpy(person2->firstName, "li");39 person2->lastName = (char*)malloc(sizeof(char) * 30);40 strcpy(person2->lastName, "si");41 person2->title = (char*)malloc(sizeof(char) * 100);42 strcpy(person2->title, "B");43 person2->age = 21;44 45 printf("The struct _person *person2 info:\n");46 printf("person2->firstName: %s\n", person2->firstName);47 printf("person2->lastName: %s\n", person2->lastName);48 printf("person2->title: %s\n", person2->title);49 printf("person2->age: %d\n", person2->age);50 51 free(person2->firstName);52 free(person2->lastName);53 free(person2->title);54 free(person2);55 56 //結構體的高級聲明,聲明方式不一樣,使用方式稍微有點不同57 typedef struct _personNew{58 char* firstName;59 char* lastName;60 char* title;61 int age;62 } Person;63 64 Person* person3;65 person3 = (Person*)malloc(sizeof(Person));66 (*person3).firstName = (char*)malloc(sizeof(char) * 20);67 strcpy((*person3).firstName, "wang");68 (*person3).lastName = (char*)malloc(sizeof(char) * 30);69 strcpy((*person3).lastName, "wu");70 (*person3).title = (char*)malloc(sizeof(char) * 100);71 strcpy((*person3).title, "C");72 (*person3).age = 29;73 74 printf("The struct _person *person3 info:\n");75 printf("(*person3).firstName: %s\n", (*person3).firstName);76 printf("(*person3).lastName: %s\n", (*person3).lastName);77 printf("(*person3).title: %s\n", (*person3).title);78 printf("(*person3).age: %d\n", (*person3).age);79 80 free((*person3).firstName);81 free((*person3).lastName);82 free((*person3).title);83 free(person3);84 85 Person* person4;86 person4 = (Person*)malloc(sizeof(Person));87 person4->firstName = (char*)malloc(sizeof(char) * 20);88 strcpy(person4->firstName, "zhao");89 person4->lastName = (char*)malloc(sizeof(char) * 30);90 strcpy(person4->lastName, "liu");91 person4->title = (char*)malloc(sizeof(char) * 100);92 strcpy(person4->title, "D");93 person4->age = 21;94 95 printf("The struct _person *person4 info:\n");96 printf("person4->firstName: %s\n", person4->firstName);97 printf("person4->lastName: %s\n", person4->lastName);98 printf("person4->title: %s\n", person4->title);99 printf("person4->age: %d\n", person4->age); 100 101 free(person4->firstName); 102 free(person4->lastName); 103 free(person4->title); 104 free(person4); 105 106 typedef struct _personNewN{ 107 char* firstName; 108 char* lastName; 109 char* title; 110 int age; 111 } *PersonN; 112 113 PersonN person5; 114 person5 = (PersonN)malloc(sizeof(PersonN)); 115 (*person5).firstName = (char*)malloc(sizeof(char) * 20); 116 strcpy((*person5).firstName, "zhou"); 117 (*person5).lastName = (char*)malloc(sizeof(char) * 30); 118 strcpy((*person5).lastName, "qi"); 119 (*person5).title = (char*)malloc(sizeof(char) * 100); 120 strcpy((*person5).title, "E"); 121 (*person5).age = 29; 122 123 printf("The struct _person *person5 info:\n"); 124 printf("(*person5).firstName: %s\n", (*person5).firstName); 125 printf("(*person5).lastName: %s\n", (*person5).lastName); 126 printf("(*person5).title: %s\n", (*person5).title); 127 printf("(*person5).age: %d\n", (*person5).age); 128 129 free((*person5).firstName); 130 free((*person5).lastName); 131 free((*person5).title); 132 free(person5); 133 134 PersonN person6; 135 person6 = (PersonN)malloc(sizeof(PersonN)); 136 person6->firstName = (char*)malloc(sizeof(char) * 20); 137 strcpy(person6->firstName, "wu"); 138 person6->lastName = (char*)malloc(sizeof(char) * 30); 139 strcpy(person6->lastName, "ba"); 140 person6->title = (char*)malloc(sizeof(char) * 100); 141 strcpy(person6->title, "F"); 142 person6->age = 21; 143 144 printf("The struct _person *person6 info:\n"); 145 printf("person6->firstName: %s\n", person6->firstName); 146 printf("person6->lastName: %s\n", person6->lastName); 147 printf("person6->title: %s\n", person6->title); 148 printf("person6->age: %d\n", person6->age); 149 150 free(person6->firstName); 151 free(person6->lastName); 152 free(person6->title); 153 free(person6); 154 155 return 0; 156 } ~代碼結果:
The struct _person *person1 info: (*person1).firstName: zhang (*person1).lastName: san (*person1).title: A (*person1).age: 29 The struct _person *person2 info: person2->firstName: li person2->lastName: si person2->title: B person2->age: 21 The struct _person *person3 info: (*person3).firstName: wang (*person3).lastName: wu (*person3).title: C (*person3).age: 29 The struct _person *person4 info: person4->firstName: zhao person4->lastName: liu person4->title: D person4->age: 21 The struct _person *person5 info: (*person5).firstName: zhou (*person5).lastName: qi (*person5).title: E (*person5).age: 29 The struct _person *person6 info: person6->firstName: wu person6->lastName: ba person6->title: F person6->age: 21通過以上代碼,相比閱讀者對數據結構有了比較深刻的認識吧。有人可能會想到魯迅筆下的孔乙己吧,這種做法會不會有茴香豆的茴字有四種寫法的賣弄,如果這樣想就錯了,編程過程中,會碰到各種奇怪的應用場景,每一種用法都要學習點,以備不時之需吧。代碼閱讀完畢了,相比讀者對使用->指針指向訪問結構體指針的字段和使用(*).解引指針和成員運算符訪問結構體指針的字段有了比較深入的理解了。
二、指針+和指針-:用于訪問數組下表對應的內容,
1、定義:可以通過對指針進行簡單的加減法,這點同普通變量一樣,但是計算機的體現又是不一樣的
2、特征:
1)、指針+和指針-的大小與加減的數值有關
2)、指針+和指針-的大小與指針的數據類型有關
3)、指針+和指針-的最終大小就是加減的數值與數據類型的大小的乘積
4)、不同的指針的指針+和指針-的大小是復雜的,要特別注意
5)、void類型的指針最好不要作加減操作
3、應用:
見如下代碼:
代碼如下:
?1 #include <stdio.h>?2
?3 int main(int argc, char **argv)
?4 {
?5???? int iArray[] = {28, 32, 89, 77};
?6???? int *ptrArray = iArray;
?7
?8???? //普通數組的訪問
?9???? printf("The iArray:\n");
10???? for(int i = 0; i < 4; i++){
11???????? printf("%d\t", iArray[i]);
12???? }
13???? printf("\n");
14
15???? //普通數組的特殊訪問
16???? printf("The Other iArray:\n");
17???? for(int i = 0; i < 4; i++){
18???????? printf("%d\t", i[iArray]);
19???? }
20???? printf("\n");
21
22???? //普通數組的指針訪問
23???? printf("The Pointer+ iArray:\n");
24???? for(int i = 0; i < 4; i++){
25???????? printf("%d\t", *ptrArray);
26???????? ptrArray += 1;
27???? }
28???? printf("\n");
29
30???? printf("The Pointer- iArray:\n");
31???? for(int i = 0; i < 4; i++){
32???????? ptrArray -= 1;????????????????????????????????????????????????? ?
33???????? printf("%d\t", *ptrArray);
34???? }
35???? printf("\n");
36
37???? return 0;
38 }
代碼結果:
The iArray:28????? 32????? 89????? 77
The Other iArray:
28????? 32????? 89????? 77
The Pointer+ iArray:
28????? 32????? 89????? 77
The Pointer- iArray:
77????? 89????? 32????? 28
代碼中的26行使用了指針+操作,32行使用了指針-操作,由于指針是int型,因此,指針每增加或減少1,地址都會增加或減少整型數據的長度4。將指針值打印出來,在25行和33行下面增加如下:
printf("%p\t", ptrArray);則代碼結果為:
The iArray: 28 32 89 77 The Other iArray: 28 32 89 77 The Pointer+ iArray: 28 0x7ffd8b190ed0 32 0x7ffd8b190ed4 89 0x7ffd8b190ed8 77 0x7ffd8b190edc The Pointer- iArray: 77 0x7ffd8b190edc 89 0x7ffd8b190ed8 32 0x7ffd8b190ed4 28 0x7ffd8b190ed0三、指針相減和指針比較:主要是方便定位兩個指針對應的數組元素的先后順序,
1、定義:可以通過對指針進行簡單的加減法,這點同普通變量一樣,但是計算機的體現又是不一樣的
2、特征:
1)、指針 - 指針的結果是兩個地址的差值,利用該差值可以很容易判別數組中的元素的順序
2)、指針+和指針-的大小與指針的數據類型有關
3)、指針與指針的比較確定指針對應數組元素的相對順序
4)、指針相減的結果大于0表示前者指針的值大于后者指針
5)、指針比較的結果1為真,0為假
3、應用:
見如下代碼:
代碼如下:
1 #include <stdio.h> 2 3 int main(int argc, char **argv)4 {5 int iArray[] = {28, 32, 89, 77,};6 int *ptr0Array = iArray;7 int *ptr1Array = iArray + 1;8 int *ptr2Array = iArray + 2;9 int *ptr3Array = iArray + 3; 10 11 printf("指針減法演示:\n"); 12 printf("ptr3Array - ptr1Array: %d\n", ptr3Array - ptr1Array); 13 printf("ptr1Array - ptr3Array: %d\n", ptr1Array - ptr3Array); 14 15 printf("指針比較演示:\n"); 16 printf("ptr3Array > ptr1Array: %d\n", ptr3Array > ptr1Array); 17 printf("ptr1Array > ptr3Array: %d\n", ptr1Array > ptr3Array); 18 19 return 0; 20 }?
代碼結果:
指針減法演示: ptr3Array - ptr1Array: 2 ptr1Array - ptr3Array: -2 指針比較演示: ptr3Array > ptr1Array: 1 ptr1Array > ptr3Array: 0代碼比較簡單,就不再啰嗦了。
轉載于:https://www.cnblogs.com/guochaoxxl/p/6952724.html
總結
以上是生活随笔為你收集整理的10深入理解C指针之---指针运算和比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pascal's Triangle Le
- 下一篇: freemarker的空值和默认值