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;
}