20150603指针基本操作及应用

本文深入探讨了指针的基本概念、操作与应用,包括地址获取、指针变量、间接寻址、指针运算等核心内容,并通过实例展示了指针在数组交换、输入输出、数组逆序、字符串替换及数组插入等场景中的实际应用。

//

//  main.c

//  IOS150603

//

//  Created by Peng Junlong on 15/6/3.

//  Copyright (c) 2015 Peng Junlong. All rights reserved.

//


#include <stdio.h>


//*************************

//*                       *

//*        指针基本操作     *

//*                       *

//*************************


//地址:变量定义在内存中,也有自己的地址

//int a;

//通过&获取变量在内存的位置,%p占位符用来打印地址

//int main(int arg ,const char *argv[])

//{

//    int a = 100;

//    printf("%p\n",&a);

//    return 0;

//}



//指针变量:是保存变量内存地址的工具;本质是变量,保存其他变量的地址

//int *p = &a;

//数据类型(指针指向变量的数据类型)+* (指针变量说明符)+变量名;

//int * 是指针变量的类型

//int main(int arg ,const char *argv[])

//{

//    int a = 100;

//    int *p = &a;

//    printf("%p\n",&a);

//    printf("%p\n",p);

//    //指针变量也是一个变量,也有自己的地址

//    printf("%p\n",&p);

//    return 0;

//}


//间接寻址 *

//通过变量的地址寻址到对应地址的变量空间

//间接寻址符*&是一对互逆运算符

//int main(int arg ,const char *argv[])

//{

//    int a = 100;

//    int *p = &a;

//    printf("a = %d\n",*p);

//    printf("a = %d\n",*&a);

//    printf("a = %d\n",a);

//}


//指针变量的大小:只跟平台有关系,32平台占4个字节,64位平台占用8个字节

//int main(int arg ,const char *argv[])

//{

//    printf("char * size = %lu\n",sizeof(char *));

//    printf("int * size = %lu\n",sizeof(int *));

//    printf("float * size = %lu\n",sizeof(float *));

//    printf("double * size = %lu\n",sizeof(double *));

//    printf("long * size = %lu\n",sizeof(long *));

//    

//    return 0;

//}


//多个指针指向同一个变量

//int main(int arg , const char *argv[])

//{

//    int a = 100;

//    int *p = &a;

//    int *p1 = p;//指针变量可以直接给指针变量赋值

//    printf("a = %d\n",*p);

//    printf("a = %d\n",*p1);

//    return 0;

//}


//泛型指针:可以指向任意变量类型的地址

//void *

//int main(int arg,const char *argv[])

//{

//    int a = 100;

//    long b = 200;

//    float c = 3.144;

//    void *p = &a;

//    printf("a = %d\n",*(int *)p);   //在访问对应的内存空间时,需要指定对应的数据类型,进行强制类型转换

//    p = &b;

//    printf("a = %ld\n",*(long *)p);

//    p = &c;

//    printf("a = %f\n",*(float *)p);

//    return = 0

//}


//空指针:NULL

//#define NULL ((void *)0);操作系统预留出来的地址,没有使用,任何类型的指针都可以指向它


//野指针:

//1.定义了指针变量后没有给初值

//2.指针变量指向的内存空间被释放

//#include <stdlib.h>

//int main(int arg,const char *argv[])

//{

//    int *p  = NULL;

//    //1.申请内存

//    p = (int *)malloc(100); //指向分配的内存空间的首地址

//    //2.判断内存是否申请成功

//    if(!p)

//        return -1;

//    //3.使用内存

//    scanf("%d",p);

//    printf("%d\n",*p);

//    //4.释放内存

//    free(p);

//    p = NULL;   //若不指向NULL,p变成野指针

//    

//    return 0;

//}



//指针运算

//++ --

//指针变量改变的长度为指针指向的数据类型的长度

//int main(int arg ,const char *argv[])

//{

//    int a[10] = {1,2,3,4,5,6,7,8,9,10};//a[0]int类型,&a[0] int * 类型

//    int *p = a;   //  数组名就是数组的首地址

//    printf("%d\n",*p);

//    for (int i=0; i<10; i++) {

//        printf("%d\n",*(p+i));  //指针加1,跳过的字节数是指针指向的数据类型的长度,

//        printf("%p\n",(p+i));   //在这里指跳过的是4个字节sizeof(int)

//

//    }

//    

//    char ch = 'a';

//    char *p1 = &ch;

//    printf("%p\n",p1);

//    p1++;

//    printf("%p\n",p1);

//    return 0;

//}


//减法运算

//两个指针进行减法运算得到的是两个指针地址之间的元素个数

//不同类型的指针不能进行减法运算

//指针不能进行加法运算,因为可能会超过内存边界

//int main(int arg ,const char *argv[])

//{

//    int a[10] = {};

//    int *p = a;

//    int *q = &a[5];

//    printf("%p %p\n",p,q);

//    printf("%ld\n",q-p);    //(q-p)/sizeof(int)

//    

//    return 0;

//}



//

//  applicationOfPointer.c

//  IOS150603

//

//  Created by Peng Junlong on 15/6/3.

//  Copyright (c) 2015 Peng Junlong. All rights reserved.

//


//*************************

//*                       *

//*        指针的应用       *

//*                       *

//*************************

#include <stdio.h>


//void swap(int *a,int *b)

//{

//    int p = *a;

//    *a = *b;

//    *b = p;

//}

//int main(int arg,const char *argv[])

//{

//    int a = 10;

//    int b =20;

//    printf("a = %p,b = %p\n",&a,&b);

//    printf("a = %d,b = %d\n",a,b);

//    swap(&a,&b);

//    printf("a = %p,b = %p\n",&a,&b);

//    printf("a = %d,b = %d\n",a,b);

//    return 0;

//}


//利用指针输入10个数到数组中,再输出

//int main(int arg ,const char *argv[])

//{

//    int a[10];

//    int *p = a;

//    for (int i=0; i<10; i++) {

//        scanf("%d",p+i);

//    }

//    for (int i=0; i<10; i++) {

//        printf("a[%d]=%d  ",i,*(p+1));

//    }

//    

//    return 0;

//}


//指针实现数组逆序

//void reverseArray(int *a,int len)

//{

//    for (int i=0; i<len/2; i++) {

//        int temp = *(a+i);

//        *(a+i) = *(a+len-i-1);

//        *(a+len-i-1) = temp;

//    }

//}

//int main(int arg ,const char *argv[])

//{

//    int a[10];

//    int *p = a;

//    for (int i=0; i<10; i++) {

//        scanf("%d",p+i);

//    }

//    reverseArray(a, 10);

//    for (int i=0; i<10; i++) {

//        printf("a[%d]=%d  ",i,*(a+i));

//    }

//    

//    return 0;

//}


//void replace(char *array,char old ,char new ,int len)

//{

//    for (int i=0; i<len; i++) {

//        if (*(array+i) == old) {

//            *(array+i) = new;

//        }

//    }

//}

//int main(int arg ,const char *argv[])

//{

//    char array[10];

//    char *p = array;

//    char old;

//    char new;

//    for (int i=0; i<10; i++) {

//        scanf("%c",p+i);

//    }

//    getchar();

//    printf("输入 old:");

//    scanf("%c",&old);

//    getchar();

//    printf("输入new:");

//    scanf("%c",&new);

//    replace(array,old,new,10);

//    for (int i=0; i<10; i++) {

//        printf("%c",*(array+i));

//    }

//    return 0;

//}


//void insert(char *array,int index,char new ,int length)

//{

//    for (int i=length-1; i>=index; i--) {

//        *(array+i+1)=*(array+i);

//    }

//    *(array+index) = new;

//}

//int main(int arg,const char *argv[])

//{

//    char array[12] = "helloworld";

//    insert(array, 6, 'A', 10);

//    printf("%s\n",array);

//    return 0;

//}


//const  指针

//只读的

//const type name

//type const name

int main(int arg,const char *argv[])

{

    const int a = 100;

    //a = 200;  //  a是只读的,不能进行修改,在这里进行会报错

    

    //****************************************************

    

    int b = 10;

    int c = 20;

    const int *p = &b;  //const 是修饰*p,在这里*p是只读的,p是可读可写的

    //*p = 30;    //这里是错误的

    p = &c;

    

    //****************************************************

    int d = 10;

    const int *const q = &d;//*q q都是只读的

    

    //****************************************************

    int e = 10;

    const int *p1 = &e,q1 = 20;//*p1q1都是只读的,p1是可读可写的

    

    const int *const p2,*q2;    //p2,*p2,*q2都是只读的,q2是可读可写的

    const int *const p3,*const q3;  //p3,*p3,q3,*q3都是只读的

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值