课外天地 李树青学习天地C语言程序设计 → [推荐]第九课代码讲义:指针


  共有12400人关注过本帖树形打印复制链接

主题:[推荐]第九课代码讲义:指针

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1938 积分:26572 威望:0 精华:34 注册:2003/12/30 16:34:32
[推荐]第九课代码讲义:指针  发帖心情 Post By:2015/11/28 9:20:23 [只看该作者]

int main()
{
    int i=0;
    int *p=&i;
    *p=1;
    printf("%d\n",i);
    printf("%d\n",p);
    printf("%d\n",*p);
    printf("%d\n",&i);
    return 0;
}

为什么要使用指针?获取了从其他地方改变当前变量的一种能力
int main()
{
    int i=0;
    func(&i);
    printf("%d",i);
    return 0;
}

void func(int *p)
{
    *p=1;
}


这并不违背形参改变不影响实参

思考:为什么scanf使用&符号而printf不使用呢?

使用函数交换数据
int main()
{
    int i=0,j=1;
    printf("i=%d,j=%d\n",i,j);
    func(&i,&j);
    printf("i=%d,j=%d\n",i,j);
    return 0;
}

void func(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}


指针访问数组
#define LEN 10

int main()
{
    int i;
    int array[LEN]= {0};
    int *p=&array[0];
    *(p+1)=2;
    for(i=0; i<LEN; i++)
    {
        printf("%d\t",array[i]);
    }
    return 0;
}

等价写法(数组名称就是指针):
#define LEN 10

int main()
{
    int i;
    int array[LEN]= {0};
    int *p=array;
    p[1]=2;
    for(i=0; i<LEN; i++)
    {
        printf("%d\t",array[i]);
    }
    return 0;
}

但是不能这样使用:
int main()
{
    int i;
    int *array={0,0,0,0};
    for(i=0; i<4; i++)
    {
        printf("%d\t",array[i]);
    }
    return 0;
}

所以数组名称作为函数参数的情况,应该考虑和指针等价
#define LEN 10

int main()
{
    int i;
    int array[LEN]={0};
    func(array);
    for(i=0; i<LEN; i++)
    {
        printf("%d\t",array[i]);
    }
    return 0;
}

void func(int array[])
{
    array[1]=1;
}

等价写法:
#define LEN 10

int main()
{
    int i;
    int array[LEN]={0};
    func(array);
    for(i=0; i<LEN; i++)
    {
        printf("%d\t",array[i]);
    }
    return 0;
}

void func(int *p)
{
    *(p+1)=1;
}


结合++运算符可以更为简单的访问数组(不再使用i)
#define LEN 10

int main()
{
    int array[LEN]= {1,2,3,4};
    int *p;
    for(p=array; p<array+LEN; p++)
    {
        printf("%d\t",*p);
    }
    return 0;
}

#define LEN 10

int main()
{
    int array[LEN]= {1,2,3,4};
    int *p=array;
    while(p<array+LEN)
    {
        printf("%d\t",*p++);
    }
    return 0;
}

二维数组的指针:
int main()
{
    int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    int *p;
    p=array;
    printf("%d\n",*p);

    p=&array[0][0];
    printf("%d\n",*p);

    p=array[1]+1;
    printf("%d\n",*p);

    p=&array[0];
    printf("%d\n",*p);

    p=&array[2];
    printf("%d\n",*(++p));

    p=array+2;
    printf("%d\n",*(++p));
    return 0;
}

有了指针可以一维的访问数组元素
为什么有问题?
int main()
{
    int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    int *p=array;
    while(p<array+12)
    {
        printf("%d\t",*p++);
    }
    return 0;
}

正确方法是:while(p<array[0]+12)


指针字符串
int main()
{
    char string1[]="Hello World!";
    puts(string1);
    char *string2="Hello World!";
    puts(string2);
    string1[5]='*';
    puts(string1);
    //string2[5]='*';
    return 0;
}
注意第二种方法不能改变字符串


可以使用指针循环的方式遍历字符串(复制)
int main()
{
    char string1[]="Hello World!";
    char string2[100];

    char *p1=string1,*p2=string2;
    while(*p1!='\0')
    {
        *p2++=*p1++;
    }
    *p2='\0';
    puts(string2);
    return 0;
}

返回值为指针的函数(慎用)
int main()
{
    int * func();
    int *p=func();
    printf("%d\n",*p);
    *p=1;
    printf("%d\n",*p);
    return 0;
}


int * func()
{
    int i=0;
    return &i;
}

指针数组
int main()
{
    int array[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12};
    int *p[3];
    int i=0;
    for(i=0; i<3; i++)
    {
        p[i]=array[i];
    }

    printf("%d\t",p[1][0]);
    return 0;
}

指向指针的指针
int main()
{
    int array[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12};
    int *p[3];
    int i=0;
    for(i=0; i<3; i++)
    {
        p[i]=array[i];
    }

    int **p1=&p[0];
    printf("%d\t",p1[1][0]);
    return 0;
}

动态分配内存
解决数组定义必须指定长度的局限性

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 回到顶部