1.相关练习
1>实现字符串逆置
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[]="hello";
char *start=str;
char *end=str+strlen(str)-1;
while (start<end)
{
char n=*start;
*start=*end;
*end=n;
start++;
end--;
}
printf("%s",str);
}
总结:通过设定start和end指向字符串的首和尾,将两者指向地址的值进行替换,再做自增和自减运算,当两者交叉停止 循环,输出最后的结果,从而实现字符串的逆置。
2>数组和地址引用关系
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[]={11,22,33,44};
int *p=arr;
for(int i=0;i<4;i++)
{
printf("%p\n",&arr[i]);
printf("%p\n",&arr[0]+i);
printf("%p\n",arr+i);
printf("%p\n",&p[i]);
printf("%p\n",&p[0]+i);
printf("%p\n",p+i);
// printf("%p\n",p++);
}
return 0;
}
总结:首先p++语句会改变p的值,所以执行时要与其他语句隔离开,综上述语句可以看出地址和数组的等价引用关系:
地址:&arr[i] --->&arr[0]+i--->arr+i--->p+i--->&p[0]+i--->p++
值:arr[i]--->p[i]--->*(&arr[0]+i)--->*(arr+i) --->*(&p[0]+i)--->*(p+i)--->*p++
3> 定义有参无返函数实现输入
void input(int* p ,int n)
{
for(int i=0;i<n;i++)
{
printf("please enter %d element:",i+1);
scanf("%d",p+i);
}
}
4>指针函数
本质上是一个函数,返回一个地址
ps:写指针函数时,不可以返回局部变量的地址
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* fun()
{
int a=100,b=200;
int arr[2];
arr[0]=a,arr[1]=b;
return arr;
}//arr是fun函数的局部变量,调用fun函数计算机申请内存,函数调用结束释放内存
因此需要将局部变量延长生命周期,或者使用其他方法 ,例如:返回堆区的内存地址malloc free
int* fun3()
{
int a=3,b=4;
int *p=malloc(8);
*p=a,*(p+1)=b;
return p;
}
总结:将局部变量在堆区申请内存,申请成功返回首地址,从而可以进行返回调用。
5>通用类型指针
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int a=100;
void *p=&a;
printf("*p=%d\n",*(int*)p);
return 0;
}
总结:通用类型指针void *p,虽然可以转换成任意类型,但是使用的时候需要进行类型转换,同时要注意在转换()时,需要注意*要在()前。