您好,登錄后才能下訂單哦!
項目12交換機后臺管理之端口管理的再次優化
項目精講
函數的值傳遞,無法通過調用函數,來修改函數的實參。
指針是什么
指針本質是一個地址值:
#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個字節。
指針的初始化
demo:
#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進制
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];
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。