指针
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=='\0')
{
return a-j;
}
}
}
int main()
{
int i;
char a[1024]={};
printf("输入:\n");
gets(a);
i=lon(&a[0]);
printf("%d\n",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=='\0')
{
break;
}
a++;
}
int n=a-j;
int m=0;
for(m=0;m<n;m++)
{
printf("b[%d]=%c\n",m,b[m]);
}
}
int main()
{
char a[1024]={};
printf("--输入--\n");
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("插入成功!\n");
}
void less(char *n,int a,char b)
{
int q=a;
for(;q<10;q++)
{
*(n+q-1)=*(n+q);
}
*(n+9)='\0';
printf("删除成功!\n");
}
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("\n");
return 0;
}
4、实现一个字符串压缩函数,压缩策略是将连续出现的字符转换成字符+次数的形式,如“abcccddeaaaaa”,压缩后变成“abc3d2ea5”;然后再编写一个解压函数。
void yasuo(char *a,char *b)
{
int i,j=1,k=0;
for(i=0;*(a+i)!='\0';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)!='\0';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("\n");
}
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