您的位置:首页 > 编程语言 > C语言/C++

IOS成长中 C语言之指针一

2014-08-06 08:58 267 查看

知识点概括:

1.指针变量

2.指针与数组

3.指针与字符串

数据的存储

字节是最小的存储单元,一个字节称为一个存储单元(内存单元),不同数据类型所占用的存储单元不等。

为了正确访问内存单元,每个内存单元都有一个编号。内存单元的编号称作地址。

内存单元中的内容才是我们关注的数据

数据的访问方式

数据访问一般分为直接访问和间接访问。

直接访问:直接访问内存单元中的内容。例如: a = 20; b = 2 * a等

间接访问:通过内存单元编号以及数据所占字节数访问内存中数据。

间接访问在程序中随处可见,指针是间接访问的常用方式

//定义一个整形变量
//    int a = 10;
//    //定义一个指针变量,和定义整型变量类似,也是包含三部分:数据类型 变量名 = 初值
//    //只不过指针变量用来存储地址而已
//    //int *指针变量类型,p指针变量名,NULL指针变量初值
//    //int 的作用:(1)当自增时增加几个字节大小,(2)当存取数据时,一次性读取几个字节
//    //定义时,* 告诉编译器,后面的变量是一个指针变量,用来存地址的
//    int *p = NULL;
//    //指向关系
//    p = &a; //将a的地址赋值给p
//    printf("%d\n", a);  //直接访问 内存单元数据
//    // *p, 此时的作用根据指针变量存储的地址,找到对应的内存单元,将内存单元上的数据调取出来
//    printf("%d\n", *p); //间接访问
//    //对于指针变量类型,所规定的存储空间的大小只和操作系统的位数有关,32位操作系统是4个字节,64位操作系统是8个字节
//    printf("%lu\n", sizeof(float *));
//    *p = 20;
//    printf("%d\n", *p);
//    int a = 15;
//    //赋值为NULL,让指针变量c指向一个无效的空间
//    int *p1 = NULL;
//    //当对c指向的空间进行操作时,c必须指向一个有效的空间(明确的空间)
//    p1 = &a;
//    *p1 = 30;
//    int **b = &p1;
//    printf("%d\n", *p1);
//    printf("%d\n", **b);
//    int c = 41;
//    p1 = &c;
//    printf("%d\n", *p1);
//    int d = 1, e = 5, f = 6;
//    p1 = &d;
//    p1 = &e;
//    p1 = &f;
//    p1 = &c;
//    //指针变量的重新赋值,叫做指针重指向,我们就看操作之前指针最后一次的指向即可
//    printf("%d\n", *p1);
//    int a[5] = {10, 41, 52, 33, 24};
//    int *p = NULL;
//让p指向数组的首地址(数组名a就代表数组的首地址,第一个元素的地址)
//    p = a;
//    p = &a[2];
//    *(p + 2) = 60;
//    printf("%d\n", *(p + 2));
//    printf("%d\n", *p);
//    p++; //p = p + 1
//    printf("%d\n", *(p + 4));
//当把数组的首地址赋给指针变量p之后,指针变量就可以当做数组名来使用
//数组名是一个常量,不可对其更改
//    for (int i = 0; i < 5; i++) {
//        printf("%d\n", p[i]);
//        printf("%d\n", *(p++));
//        printf("%d\n", *(a + i));
//    }

//1.给数组元素赋值
//    int a[5] = {0};
//    int *p = NULL;
//    p = a;
//    for (int i = 0; i < 5; i++) {
//        *(p++) = arc4random() % 21 + 20;
//    }
//    p = &a[0];  // 经过5次自增 p的值已不是a[5]数组的首地址,要重置一次
//    //2.对数组进行升序排序
//    for (int i = 0; i < 4; i++) {
//        for (int j = 0; j < 4 - i; j++) {
//            if (*(p + j) > *(p + j + 1)) {
//                int temp = *(p + j);
//                *(p + j) = *(p + j + 1);
//                *(p + j + 1) = temp;
//            }
//        }
//    }
//    //3.输出数组中元素
//    for (int i = 0; i < 5; i++) {
//        printf("%d ", *(p++));
//    }
//    assignArr(a, 5);
//    sortArr(a, 5);
//    outputArr(a, 5);

//    short a[4] = {3, 1, 2, 1};
//    int *p1 = a;
//    char *p2 = a;
//    printf("%d %d", *(p1 + 1), *p2);

//指针与字符串
//    char temp[20] = "android";
//    char *p = NULL;
//    p = temp;
//    *(p + 8) = 'a';
//    printf("%s\n", temp + 5);
//    printf("%c\n", *(p + 5));
//    //求字符串长度
//    int i = 0; //循环变量初始化(initialization)
//    int length = 0;  //用来存储字符串的字符的个数
//    //condition
//    while (*(p + i) != '\0') {
//        length++;  //statements
//        i++;  //循环变量增量(increment)
//    }
//    printf("%d", length);

//指针数组(数组中的每一个元素都是一个指针变量)
//    char str = "Frank";
//    char *a[3] = {"Frank", "Duck", "iPhone"};
/*
*  字符数组str 需要存储字符,所以把常量区中Frank字符串的内容拷贝到数组中,
而对于数组a来说,数组中的每一个元素都是一个字符型的指针变量,指针变量用来存储地址,
所以将常量区中的Frank,Duck,iPhone的开始地址拷贝到对应的变量中,通过指针操作操作的时常量区的内容
*/
//常量区中的内容不可更改
//    printf("%s", a[2]);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: