指针初步总结及练习

总结 

        由于指针一章介绍的内容较多,指针的概念和应用比较复杂,初学者不易掌握,为了帮助读者建立清晰的概念,本节对有关指针的知识和应用作简单的归纳小结。

        首先要准确理解指针的含义。“指针”是C语言中一个形象化的名词,形象地表示“指向”的关系,其在物理上的实现是通过地址来完成的。正如高级语言中的“变量”,在物理上是“命名的存储单元”。Windows中的“文件夹”实际上是“目录”。离开地址就不可能弄清楚什么是指针。明确了“指针就是地址”,就比较容易理解了,许多问题也迎刃而解了。例如:

        &a是变量a的地址,也可称为变量a的指针。
        指针变量是存放地址的变量,也可以说,指针变量是存放指针的变量。
        指针变量的值是一个地址,也可以说,指针变量的值是一个指针。
        指针变量也可称为地址变量,它的值是地址。
        &是取地址运算符,&a是a的地址,也可以说,&是取指针运算符。&a是变量a
的指针(即指向变量a的指针)。
        数组名是一个地址,是数组首元素的地址,也可以说,数组名是一个指针,是数组首
元素的指针。
        函数名是一个指针(指向函数代码区的首字节),也可以说函数名是一个地址(函数
代码区首字节的地址)。
        函数的实参如果是数组名,传递给形参的是一个地址,也可以说,传递给形参的是一
个指针。


        本章介绍了指针的基本概念和初步应用。指针是C语言中很重要的概念,是C的一个重要特色。使用指针的优点:①提高程序效率;②在调用函数时当指针指向的变量的值改变时,这些值能够为主调函数使用,即可以从函数调用得到多个可改变的值;③可以实现动态存储分配。

        同时应该看到,指针使用实在太灵活,对熟练的程序人员来说,可以利用它编写出颇有特色、质量优良的程序,实现许多用其他高级语言难以实现的功能,但也十分容易出错,而且这种错误往往比较隐蔽。

        指针运用的错误可能会使整个程序遭受破坏,比如由于未对指针变量p赋值就向*p赋值,就可能破坏了有用的单元的内容。如果使用指针不当,会出现隐蔽的、难以发现和排除的故障。因此,使用指针要十分小心谨慎,要多上机调试程序,以弄清-些细节,并积累经验。 

练习

 1、将字符串"software"赋给一个字符指针,并从第一个字母开始间隔地输出该串

输入样例:

在这里给出一组输入。例如:

输出样例:

在这里给出相应的输出。例如:

sfwr
#include <stdio.h>
int main()
{
    char* a = "software";
    char b[9];
    char* p = b;
    int i = 0;
    while (*a != '\0')
    {
        if (i % 2 == 0 || i == 0)
        {
            *p++ = *a; 
        }
        a++; 
        i++;
    }
    *p = '\0';
    printf("%s", b);
    return 0;
}

 2、将10个数逆序排序,借助指针实现。

输入样例:

21 12 45 43 87 897 534 67 90 75

输出样例:

21 12 45 43 87 897 534 67 90 75 
75 90 67 534 897 87 43 45 12 21 
#include <stdio.h>
int main()
{
    int a[10];
    int i,t;
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]); 
    } 
    printf("\n");
    int *p,*j;
    p=&a[0];
    j=&a[9];
    while(p<=j)
    {
        t=*p;
        *p=*j;
        *j=t;
        p++;
        j--;
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]); 
    } 
    return 0;
}

 3、有一个字符串,包含n个字符,写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另外一个字符串。

输入样例:

在这里给出一组输入。例如:

reading__room 
10

输出样例:

在这里给出相应的输出。例如:

room

 

#include "stdio.h"
#include "string.h" 
void copystr(char *p1,char *p2,int m);
int main()
{
    int m;
    char str1[20],str2[20];
    gets(str1);
    scanf("%d",&m);
    if (strlen(str1)<m)
     printf("input error");
    else
     {
       copystr(str1,str2,m);
       puts(str2);
   
    }
      return 0; 
}

void copystr(char *p1,char *p2,int m)
{
    int i,b=strlen(p1);
    for(i=m-1;i<b;i++)
    {
        *p2=*(p1+i);
        p2++;
    }
    *p2='\0';
}

4、数组指针与二维数组的关系

利用数组指针p将main函数中输入的二维数组a的所有元素输出, 要求先按行的顺序输出,然后再以列的顺序输出, 其中输出整型格式用 "%3d", (测试用数据大小不要超过2位数)。

输入样例:

在这里给出一组输入。例如:

1 2 3
4 5 6

输出样例:

  1  2  3
  4  5  6
  1  4
  2  5
  3  6
#include <stdio.h>
int main()
{
    void reOut(int (*p)[3]);
    int i, j, a[2][3], (*p)[3];
    for (i = 0; i < 2; i++)
        for (j = 0; j < 3; j++)
        scanf("%d", &a[i][j]);
    p= a;
    reOut(p); 
}

void reOut(int (*p)[3])
{
    int i,j;
    for(i=0;i<2;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%3d",*(*(p+i)+j));
        }
        printf("\n");
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<2;j++)
        {
            printf("%3d",*(*(p+j)+i));
        }
        printf("\n");
    }
}

 5、使用函数删除字符串中的字符

输入样例:

3               (repeat=3)
happy new year  (字符串"happy new year")
a               (待删除的字符'a')
bee             (字符串"bee")
e               (待删除的字符'e')
111211          (字符串"111211")
1               (待删除的字符'1')

输出样例:

result: hppy new yer    (字符串"happy new year"中的字符'a'都被删除)
result: b               (字符串"bee"中的字符'e'都被删除)
result: 2               (字符串"111211"中的字符'1'都被删除)
#include <stdio.h>
#include <string.h>
int main()
{
    void delchar(char *str,char c);
    int i,n;
    char c;
    scanf("%d\n",&n);
    char s[100];  
    for(i=0;i<n;i++)
    {
        scanf("%s\n",s);
        scanf("%c\n",&c);
        delchar(s,c);
        printf("result: %s\n",s);
    }
    return 0;
}
void delchar(char *str,char c)
{
    int i,j=0;
    for(i=0;str[i]!='\0';i++)
    {
        if(str[i]!=c)
        {
            str[j++]=str[i];
        }
    }
    str[j]= '\0';
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值