C语言 指针

 

指针的基本声明:

void test() {
    char a;
    // a = 10; 直接引用
    
    // 定义了一个指针变量b,而且b只能指向char类型的变量
    char *b;
    
    // 让指针变量b指向a
    b = &a;
    
    // 这里的*b代表:访问b值对应的存储空间(也就是变量a的存储空间)
    // 相当于a = 10;
    *b = 10;
    
    printf("%d\n", a);
    
    a = 11;
    
    // 这里的*b相当于取出变量a存储的值
    printf("%d\n", *b);
}

void test1() {
    char a = 10;
    
    char *b = &a;
    /* 相当于下面两句
     char *b;
     b = &a;
     */
}

void test2() {
    // 这是错误的做法
    char *p;
    // 应该在指针确定指向的变量后,再进行相应的操作
    *p = 10;
}

void test3() {
    // 这个错发也是错误的
    char *p;
    // 指针变量是用来存储变量地址的,不能随便赋值一个常数,除非你这个常熟恰好是某个变量的地址
    p = 100;
}

int main(int argc, const char * argv[])
{
    
    return 0;
}
View Code

 

指针-数组-函数参数:

#include <stdio.h>

// 这个函数用来修改数组的第一个元素
void change(char c[]) {
    c[0] = 1;
}

void change2(char *c) {
    // *(c+2) = 10; 修改a[2]的值
    
    c[2] = 10;
}

int main(int argc, const char * argv[])
{
    char a[3];
    
    //char *p = a;
    
    change2(a);
    
    printf("a[2]=%d", a[2]);
    
    return 0;
}
View Code

 

指针例子:计算 差 and 和

int sumAndMinus(int v1, int v2, int *p) {
    *p = v1 - v2;
    return v1 + v2;
}

int main(int argc, const char * argv[])
{
    int a = 10;
    int b = 4;
    
    // 接收a跟b的和
    int sum;
    // 接收a跟b的差
    int minus;
    
    sum = sumAndMinus(a, b, &minus);
    
    printf("sum=%d, mimus=%d", sum, minus);
    return 0;
}
View Code

 

指针与一维数组:

void test() {
    int a[2];
    
    int *p;
    
    // p = &a[0];
    p = a;
    
    *p = 10;
    
    printf("%d", a[0]);
}

void test1() {
    int a[3] = {1, 2, 3};
    
    for (int i = 0; i<3; i++) {
        printf("a[%d]=%d\n", i, a[i]);
    }
}

void test2() {
    char a[3] = {1, 2, 3};
    // 让指针指向第一个元素
    char *p = a;
    
    for (int i = 0; i<3; i++) {
        printf("a[%d]=%d\n", i, *(p+i));
    }
}

void test3() {
    int a[3] = {1, 2, 3};
    // 让指针指向第一个元素
    int *p = a;
    
//    p == ffc1
//    p + 1 == ffc3
//    p + 2 == ffc5
    
    // 遍历完数组后,p的值并没有变过
    for (int i = 0; i<3; i++) {
        printf("a[%d]=%d\n", i, *(p+i));
    }
}

void test4() {
    int a[3] = {1, 2, 3};
    // 让指针指向第一个元素
    int *p = a;
    
    // 在遍历数组的过程中,指针的值一直在改变
    for (int i = 0; i<3; i++) {
        printf("a[%d]=%d\n", i, *(p++));
    }
}

void test5() {
    int a[3] = {1, 2, 3};
    
//    a == ffc1;
//    a + 1 == ffc3
//    a + 2 == ffc5
    
    // 不能够写成a++,因为a是个常量
    for (int i = 0; i<3; i++) {
        printf("a[%d]=%d\n", i, *(a + i));
    }
}

void test6() {
    int a[3] = {1, 2, 3};
    // 让指针指向第一个元素
    int *p = a;
    
//    p == a == ffc1
//    p++ == a + 1 == ffc3
//    p++ == a + 2 == ffc5
    
    // 在遍历数组的过程中,指针的值一直在改变
    for (int i = 0; p < a + 3; i++, p++) {
        printf("a[%d]=%d\n", i, *p);
    }
}

int main(int argc, const char * argv[])
{
    
    test6();
    return 0;
}
View Code

 

指针与字符串:

void test() {
    char s[7] = "itcast";
    
    for (int i = 0; s[i] != '\0'; i++) {
        printf("%c\n", s[i]);
    }
}

void test1() {
    // 定义了一个字符串变量
    char s[7] = "itcast";
    
    char *p = s;
    
    for (; *p != '\0'; p++) {
        printf("%c\n", *p);
    }
}

void test2() {
    // 定义的是字符串常量
    char *p = "itcast";
    
//    char *p;
//    
//    p = "itcast";
    
    for (; *p != '\0'; p++) {
        printf("%c\n", *p);
    }
}

int main(int argc, const char * argv[])
{
    
    
    // test2();
    
    char *s = "lmj";
    
    *s = 'f';
    
    
    return 0;
}
View Code

 

posted on 2017-05-24 16:10  守望星空  阅读(183)  评论(0编辑  收藏  举报

导航