指针

day08-指针
一、数据的地址
    使用‘&’可以获取数据的地址

    int a; ==>&a
    int b[5]; ==> b
    void test(void); ==> test 或 &test

二、通过地址访问数据
    使用‘*’可以通过地址访问数据
    *(&a)

三、指针变量
    int a = 250;
    int *p = &a;
    *p <==> *(&a) <==> a
    
    指针变量也是变量,指针的指向是可以修改的;
    只是它的内容不是值,而是地址。

    int a[5];
    int *p = a;
    p[i] <==> a[i]
    p+i <==> a+i <==> &a[i]
    *(p+i) <==> *(a+i) <==> a[i] <==> p[i]
    
    没有初始化的指针叫野指针,使用非常危险;
    若暂时不清楚用途,可初始化为NULL。

四、void *指针
    通用指针,任意类型的指针
    int a = 250;
    void *p = &a;
    *((int *)p)
    通用指针不能直接取值,必须强制类型转换

五、指针运算
        加减一个整数:加减的单位是其指向的数据类型的大小        两个指针相减:结果不是指针的数值差,
                                                    而是他们相差元素的个数。

六、指针变量的大小
        指针变量的大小与其指向的数据类型无关,取决于OS

七、const修饰的指针
        定义只读变量时必须要初始化,否则没有意义。
        

        1、const int *a; 和 int const *a;
        a的指向可以修改,a指向的内容不可修改
        2、int *const a;
        a的指向不可修改,a指向的内容可以修改
        3、const int * const a;
        a的指向不可修改,a指向的内容不可修改

        总结:const修饰谁,谁就不可改变

八、复杂的指针
    1、声明字符串char *p = "abcd";
            指针指向的内容不能修改。
    2、二级指针(多级指针亦如此)
            int a = 250;
            int *p = &a;
            int **q = &p;
            *q <==> p <==> &a
            *(*q) <==> *p <==> *(&a) <==> a
            在使用中要清楚每个指针变量表示的意思。

    若想在函数中修改参数的值,必须传递变量的地址。

    3、函数指针,见18.c

九、指针数组
    由指针变量构成的数组,其中每个元素都是指针变量

    int *a[5];
    char *b[5]  = {
            “123”,
            “456”,
            “abc”
    };

char *p = “abcdefg”;
char s[100];
strcpy(s, p);
strlen(s);
strlen(strcpy(s, p)) //级联操作

练习:
1、求一个字符串的长度(strlen)

#include<stdio.h>
int lon(char *a)
{
    int i=0;
    char *j=a;
    for(i=0;i<1024;i++)
    {
        a=a+1;
        if(*a=='')
        {
            return a-j;
        }
    }
}
int main()
{
    int i;
    char a[1024]={};
    printf("输入: ");
    gets(a);
    i=lon(&a[0]);
    printf("%d ",i);
    return 0;
}


2、实现一个同strcpy函数功能相同的函数

void fuzhi(char *a)
{
    int i=0;
    char *j=a;
    char b[1024]={};
    for(i=0;i<1024;i++)
    {
        b[i]=*a;
        if(*a=='')
        {
            break;
        }
        a++;
    }
    int n=a-j;
    int m=0;
    for(m=0;m<n;m++)
    {
        printf("b[%d]=%c ",m,b[m]);
    }
}
int main()
{
    char a[1024]={};
    printf("--输入-- ");
    gets(a);
    fuzhi(&a[0]);
    return 0;
}
3、实现两个函数分别实现数组元素的插入和删除

void add(char *n,int a,char b)
{
         int m=a;
        int q,p=10-a;    
        for(q=0;q<p;q++)
        {
            *(9+n-q)=*(9+n-q-1);
        }
        *(n+m)=b;
        printf("插入成功! ");
}
void less(char *n,int a,char b)
{
    int q=a;
    for(;q<10;q++)
    {
        *(n+q-1)=*(n+q);
    }
    *(n+9)='';
    printf("删除成功! ");
}
int main()
{
    char a[10]="abcdefghij";
    //add(&a[0],3,'A');
    less(&a[0],3,'c');
    int i;
    for(i=0;i<10;i++)
    {
        printf("%c ",a[i]);
    }
    printf(" ");
    return 0;
}
4、实现一个字符串压缩函数,压缩策略是将连续出现的字符转换成字符+次数的形式,如“abcccddeaaaaa”,压缩后变成“abc3d2ea5”;然后再编写一个解压函数。

void yasuo(char *a,char *b)
{
    int i,j=1,k=0;
    for(i=0;*(a+i)!='';i++)
    {
        if(*(a+i)!=*(a+i+1))
        {
            *(b+k)=*(a+i);
            if(j==1)
            {k++;}
            else
            {k=k+2;j=1;}
        }
        else
        {
            j++;
            *(b+k+1)=j+48;
        }
    }
}
void jieya(char *a,char *b)
{
    int i,j=0,k=0;
    for(i=0;*(a+i)!='';i++)
    {
        if(*(a+i)>='a'&&*(a+i)<='z')
                {
                    if(j!=0)
                    {k=k+j;j=0;}
                    else
                    {k++;}
                    *(b+k-1)=*(a+i);
                }
        else
        {
            for(j=0;j<(*(a+i)-48)-1;j++)
            {
                *(b+k)=*(b+k-1);
                k++;
            }
        }
    }
}
void bianli(char *c)
{
    int i;
    for(i=0;i<10;i++)
    {
        printf("%c",*(c+i));

    }
    printf(" ");
}
int main()
{
    char a[10]="ab2s3df2";
    char b[10]="abbsssdff";
    char c[10];
    char d[10];
    yasuo(&b[0],&c[0]);
    jieya(&a[0],&d[0]);
    bianli(&c[0]);
    bianli(&d[0]);

    return 0;
}


5、仿照strcmp实现一个mystrcmp
6、用自己实现的比较方法对字符指针数组进行排序
7、利用命令行参数实现一个计算器。
        如:./a.out 30 + 50,打印:80






原文地址:https://www.cnblogs.com/rainwz/p/4588994.html