ダニエルに白[12]スイッチの管理を最適化するために道路再び楽屋ポート管理

再びバックオフィス管理ポートスイッチ項目の最適化12
項目簡潔

1.なぜべきである私達のポインタ

伝達関数の値ではなく、関数を呼び出して、関数の引数を変更します。

2.ポインタの定義

ポインタとは何ですか

それは本質的に、ポインタのアドレス値です:

#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バイト。

3.初期化ポインタ、訪問

ポインタの初期化
ダニエルに白[12]スイッチの管理を最適化するために道路再び楽屋ポート管理
デモを:

#include <stdio.h>

int main(void) {
    int mygirl = 18;
    int *p1 = &mygirl;

    int *p2 = p1;
    return 0;
}

ポインタアクセス

アクセスポインタの
デモ

#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;
}

バイナリ16進16(補足)
10進、バイナリ、進

小数:
一人一人、10個の状態(0,1,2,3,4,5,6,7,8,9)、毎10 1に存在します

バイナリ:
コンピュータは2つだけ229を認識し
、それぞれを2つの状態(0,1)があります

ヘキサン:
それぞれ、16の状態(0,1,2,3,4,5,6,7,8,9、A、B、Cがあり 、D、E、F)は、
説明の便宜上、我々多くの場合、いくつかのバイナリデータを16進数に変換されます

例:
10進:257
バイナリ:100000001
ヘキサン:0x101の
アクセスポインタポイントコンテンツへ
ダニエルに白[12]スイッチの管理を最適化するために道路再び楽屋ポート管理

#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;
}

4. NULLポインタ

1.ヌルポインタとは何ですか?

ヌルポインタは、ポインタ値はゼロです。
* P int型;
P = 0;

2.ヌルポインタのアクセス結果
#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;
}

6.文字算術

増分ポインタ演算

#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;
}

ポインタと整数間の減算

ポインタとポインタ間の減算

7.ヌル・ポインター

良いコーディングプラクティス:NULLポインタを使用します

8.配列へのポインタ

プロジェクトの要件

さらに最適化するために、ポート管理ポインタコードより簡潔な。

プロジェクト実現

プロジェクトの実践

中国語の文字を含む文字列の逆転を達成するために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];
    }
}

おすすめ

転載: blog.51cto.com/14632565/2462472