項目12交換機後臺管理之端口管理的再次優化
項目精講數組
函數的值傳遞,沒法經過調用函數,來修改函數的實參。ide
指針是什麼函數
指針本質是一個地址值:優化
#include <stdio.h> int main(void){ int age; //定義了一個指針 //指針是一個變量 //這個變量的名稱是 p //這個指針,能夠用來指向一個整數! //就是說:p的值是一個整數的地址!!! int * p; //指針p指向了age //p的值,就是變量age的地址 p = &age; scanf("%d", p); printf("age=%d\n", age); return 0; }
指針的定義編碼
int p;
或者:
int p;
或者:
int * p;指針
c語言中的指針,佔用4個字節。code
指針的初始化
demo:blog
#include <stdio.h> int main(void) { int mygirl = 18; int *p1 = &mygirl; int *p2 = p1; return 0; }
訪問指針
demo字符串
#include <stdio.h> int main(void) { int mygirl = 18; int *p1 = &mygirl; int *p2 = p1; //1. 訪問(讀、寫)指針變量自己的值!!!(和其餘普通變量的訪問方式相同) int *p3; p3 = p1; //讀指針p1的值, 設置指針p3的值 printf("p1=%d\n", p1); //不建議使用該方式 //使用16進制打印,把地址值當成一個無符號數來處理的 printf("p1=0x%p\n", p1); printf("p1=0x%x\n", p1); printf("p1=0x%X\n", p1); return 0; }
2進制與16進制(補充)
10進制,2進制,16進制get
10進制:
每一位,有10種狀態(0,1,2,3,4,5,6,7,8,9),逢10進1
2進制:
計算機只識別2進制
每一位,有2種狀態(0,1)
16進制:
每一位,有16種狀態(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f)
爲了描述方便,咱們經常把一些二進制數據,轉換爲16進製表示
好比:
10進制:257
二進制:100000001
16進制:0x101
訪問指針所指向的內容
#include <stdio.h> int main(void) { int my_girl = 18; int *p = &my_girl; int x; x = *p; //*是一個特殊的運算符,*p表示讀取指針p所指向的變量的值 printf("x=%d\n", x); printf("*p = %d\n", *p); my_girl++; printf("*p = %d\n", *p); return 0; }
空指針,就是值爲0的指針。
int *p;
p = 0;
#include <stdio.h> int main(void) { int *p; p = 0; //p就是一個空指針! printf("%p\n", p); //訪問空指針指向的值,將致使程序崩潰!!! printf("%d\n", *p); //讀取 地址爲0的int類型變量 system("pause"); printf("程序結束\n"); return 0; }
3.空指針的使用
1)指針初始化爲空指針
例如: int p = 0;
建議這樣使用:
int p = NULL;
目的就是,避免訪問非法數據。
2)指針再也不使用時,能夠設置爲空指針
int *my_girl = &xiao_long_lv;
my_girl = NULL;
1)表示這個指針尚未具體的指向
int *p = NULL;
if (!p) {
......
}
#include <stdio.h> struct friend { char name[32]; char sex[3]; int age; }; int main(void) { struct friend f1 = { "小龍女", "女", 18 }; //定義了一個指針變量p, //這個my_girl能夠指向一個struct friend類型的變量 struct friend *my_girl; my_girl = &f1; //直接經過結構體變量來訪問該結構體內部的成員 printf("%s, %s, %d\n", f1.name, f1.sex, f1.age); //經過指針p來訪問結構體內部的成員 //方式1, 不多使用該方式 printf("%s, %s, %d\n", (*my_girl).name, (*my_girl).sex, (*my_girl).age); //方式2 printf("%s, %s, %d\n", my_girl->name, my_girl->sex, my_girl->age); return 0; }
指針的自增運算
#include <stdio.h> int main(void) { int ages[] = {20,15,16,14,23,28,30,38, 35, 32, 26}; int len = sizeof(ages) / sizeof(ages[0]); //先使用數組的方式來訪問 for (int i=0; i<len ; i++) { printf("第%d個學員的年齡是:%d\n", i+1, ages[i]); } //使用指針來訪問 //int *p = ages; //指針p指向ages[0] int i = 0; for (int *p = ages; p < ages+len ; p++, i++) { printf("第%d個學員的年齡是:%d\n", i+1, *p); } return 0; }
指針的自減運算
#include <stdio.h> #include <string.h> /** * 讓用戶輸入一個字符串,而後反向輸出(不能改變原來的字符串!) * "12345" 逆轉成 "54321" */ int main(void) { char line[128]; int len; char tmp; printf("請輸入一個字符串: "); gets(line); len = strlen(line); //方法1 (改變了字符串自己) /* for (int i=0; i<len/2; i++) { tmp = line[i]; line[i] = line[len-1-i]; line[len-1-i] = tmp; } printf("逆轉之後:%s\n", line); */ //方法2:不改變字符串 /* for (int i=len-1; i>=0; i--) { printf("%c", line[i]); } */ //用指針來重寫方法2 char *p1 = line; char *p2 = p1 + len -1; for (char *p=p2; p>=p1; p--) { //p--,就至關於: p=p-1 printf("%c", *p); } return 0; }
指針與整數之間的加減運算
指針與指針之間的加減運算
良好的編碼習慣:使用空指針
使用指針進一步優化端口管理,使代碼更簡明。
1.實現含有中文字符的字符串逆轉
void reverse(unsigned char *s) { int len = strlen(s); unsigned char tmp[len+1]; unsigned char *p1 = s; unsigned char *p2 = tmp + len; *p2-- = 0; while (*p1) { if (*p1 < 0xA0) { //ASCII字符,通常都是小於等於127的。 *p2-- = *p1++; } else { *(p2-1) = *p1++; *p2 = *p1++; p2 -= 2; } } for (int i=0; i<len; i++) { s[i] = tmp[i]; } }