C指针

讲解C指针

Int *p = &a   等价于
int *p;
p=&a;
相当于 (int *) p = &a

二维数组的指针是难点,如何区分元素的地址和元素的值。
函数的指针: int (*pf)();  指向函数的指针,存放的是函数的地址
             int *ap(int x,int y) 指针型函数,返回值是指针指针类型

字符串数组和字符指针的区别:数组是在内存中开辟了一段空间存放字符串;字符串指针是在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给str
赋值方式:对字符数组只能对各个元素赋值,对字符指针变量可以直接赋值
注意:char *p;
scanf(“%s”,p);   这样会出错,p是指向文字常量区的,不用输入
                                要把p定义成数组 char p[100];

Strlen 测量字符串长度,但不包括‘\0’

命令行参数:main(int?argc?,char?*argv[?])  (参数的个数, 指针数组)

练习:用指针数组存放星期的英文,输入一个数,判断是星期几,输出指针所指向的字符串。输入一个字符,判断是数字,标点或空格,用字符处理函数做。自己写一个字符串处理函数,实现strcpy功能。
char *my_strcpy(char *dest, const char *src) //*src中的内容不能被改变
{
    int i = 0;
    while (src[i] != '\0')
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
}

字符(串)处理函数的用法,用到什么查书就行了。
试着编写已有的字符(串)处理函数,实现相同的功能。

    数组 int a[4]= { 1,2,3,4 }

    指针数组 定义一个指针数组,用于存放若干个字的首地址
  int *p[4] ={ &a[0],&a[1],&a[2],&a[3]};

  数组指针 定义一个指向二维数组的指针变量
  int a[3][4] ={
  {1,3,5,7},
  {9,11,13,15},
  {17,19,21,23}
  };
  int (*p)[4] = a;
  p等价于指向二维数组第0行,可完全代替a的作用
指针数组与字符串的联系:
char *name[3] = {"Li jing", "Wan mi", "Xu shang"};
name[0] = "li jing";
name[1] = "wang mi";
name[2] =  "Xu shang";
不要以为数组中存放的是字符串,它存放的是字符串首地址。这一点一定要注意!

void类型的指针:
void指针是一种很特别的指针,并不指定它是指向哪一种类型的数
据,而是根据需要转换为所需数据类型

main(int argc ,char *argv[ ])

    int i,len=0;
    for(i=1;i<argc;i+=2)
    len+=strlen(argv[i]);
    printf("%d\n",len);

经编译链接后生成的可执行文件是ex.exe,若运行时输入以下带参数的命令行
ex   abcd   efg   h3   k44
执行后输出结果是 6

指针部分练习题目
        程序设计题(要求用指针的方法完成)

1、编写程序,将一个字符串反向存放。

2、编写程序my_strlen(char *str),测得指定字符串的长度

3、编写一个字符串拷贝函数,my_strcpy(char *dest,char *src)
    将源操作数src中的字符串拷贝到dest所指向的数组中

4、编写一个函数实现将"12345"变成十进制12345

5、编写函数my_strcmp(char *str1, char  *str2),比较、返回两等长字符串的大小
要求相等返回0,字符串1大于字符串2返回1,字符串2大于字符串1返回-1
字符串1的第一个字母大于字符串2的第一个字母,则判定字符串1大于字符串2,相等
则比较第二字母,以此类推,全部相同则判定两字符串相等

习题答案
1、
#include <stdio.h>
#include <string.h>
typedef unsigned char uchar ;
typedef unsigned int uint ;

char str[] = "sdfgjhkdshjstrtgfrsr";

void reserve(char *str)
{
    uint i,j;
    char temp;
    printf("%s\n", str);
    j=strlen(str);
     for(i=0;i<j/2;i++)
    {
        temp = *(str+i);
         *(str+i) = *(str+j-i-1);
         *(str+j-i-1) = temp;
    }
    printf("%s\n", str);
}

int main(void)
{

    reserve(str);
    return 0;
}

2、
#include <stdio.h>
#include <string.h>
typedef unsigned char uchar ;
typedef unsigned int uint ;

char str[] = "0123456789";

uint my_strlen(char *str)
{
    uint lenth = 0;
    while(*str!='\0')
    {
        lenth++;
        str++;
    }
    return lenth;
}

int main(void)
{

    printf("字符串长度:%d\n",my_strlen(str));
    return 0;
}

3、
#include <stdio.h>
#include <string.h>
typedef unsigned char uchar ;
typedef unsigned int uint ;

char target[11] = "";
char sorce[11] = "0123456789";


void my_strcpy(char *dest,char *src)//将源操作数src中的字符串拷贝到dest所指向的数组中
{
    while(*src!='\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
}

int main(void)
{
    printf("操作前的target:%s\n", target);
    printf("操作前的sorce:%s\n", sorce);
    my_strcpy(target, sorce);
    printf("操作后的target:%s\n", target);
    return 0;
}

4、
#include <stdio.h>
#include <string.h>
typedef unsigned char uchar ;
typedef unsigned int uint ;

char str[] = "123456789";

uint my_strlen(char *str)
{
    uint lenth = 0;
    while(*str!='\0')
    {
        lenth++;
        str++;
    }
    return lenth;
}

uint conver(char *str)
{
    uint lenth;
    uint i;
    uint value = 0;

    lenth = my_strlen(str);
    for(i=0;i<lenth;i++)
    {
        value *= 10;
        value += *(str+i)-'0';
    }
    return value;
}

int main(void)
{
    printf("转换后的值:%d\n",conver(str));
    return 0;
}

5、
#include <stdio.h>
typedef unsigned char uchar ;
typedef unsigned int uint ;

char str1[] = "abcdef";
char str2[] = "abcdef";

char my_strcmp(char *str1, char  *str2)
{
    char temp=0;
    uint lenth,lenthtemp = 0;
    lenth = strlen(str1);
    while(temp==0 && lenthtemp<lenth)
    {
        temp = *str1 - *str2;
        str1++;
        str2++;
        lenthtemp++;
    }
    if(temp<0)
    {
        temp = -1;
    }
    else if(temp>0)
    {
        temp = 1;
    }
    return temp;
}

int main(void)
{
    printf("\n比较结果:%d\n",my_strcmp(str1, str2));
    return 0;
}

posted @ 2012-04-02 08:44  福。oO  阅读(992)  评论(0编辑  收藏  举报