/*
指针相关
*/
//指针变量为函数参数
//指针与一维数组
//数组名为数组元素的首地址,是一个指向数组中第一个元素的 指针常量,可以直接视为一个指针常量来操作
//下标法引用数组
#include <stdio.h>
int main(){
int a[5],i;
printf("Input five numbers :");
for(i=0;i<5;i++){
scanf("%d",&a[i]); //此处为地址
}
for(i=0;i<5;i++){
printf("%4d",a[i]); //此处为数组元素
}
printf("\n");
return 0;
}
//指针常量引用数组1
int main(){
int a[5],i;
printf("Input five numbers :");
for(i=0;i<5;i++){
scanf("%d",a+i); //a为指针常量
}
for(i=0;i<5;i++){
printf("%4d",*(a+i)); //a为指针常量
}
printf("\n");
return 0;
}
//指针常量引用数组2
int main(){
int a[5],*p;
printf("Input five numbers :");
for(p=a;p<a+5;p++){
scanf("%d",p); //p为指针常量
}
for(p=a;p<a+5;p++){
printf("%4d",*p); //p为指针常量
}
printf("\n");
return 0;
}
/*以上,p+1与p++的区别,二者都是增1操作,但p+1并不改变指针的指向,即p+1执行后p仍指向数组首地址;
p++执行的是p=p+1,p的指向在不断向前递增
*/
//下标形式的指针
int main(){
int a[4],*p=NULL,i;
printf("Input four numbers:");
p=a; //指针常量a赋值给指针变量p,tips:a为常量,所以a++错误,p为变量,p++正确
for(i=0;i<4;i++){
scanf("%d",&p[i]); //&p[i]等价与p+i
}
for(i=0;i<4;i++){
printf("%4d",p[i]); //p[i]等价于*(p+i)
}
return 0;
}
/*字符指针
char *ptr = "Hello";
char *ktr;
char str[10] = "Hello";
ktr = str
tips:同数组,字符串名代表其首地址的指针常量,所以str的值不可以改变,但是ktr的值可以改变
因为其是变量
*/
//函数返回字符串指针、字符串指针为参数
/*连接两个字符串,最后返回连接后字符串的地址 */
#include <stdio.h>
#define N 80
char *MyStrcat(char *dstStr,char *srcStr);
int main(){
char first[2*N];
char second[N];
printf("Input the first string:");
gets(first); //输入字符串,tab/空格不作为终止
printf("Input the second string:");
gets(second); //输入字符串,tab/空格不作为终止
printf("The result is:%s\n",MyStrcat(first,second)) //此处first,second数组名为指针指针常量
return 0;
}
char *MyStrcat(char *dstStr,char *srcStr){
char *pStr = dstStr; //保存dstStr字符串的首地址
while(*dstStr != '\0'){ //*dstStr != '\0'表示未到字符串末,*dstStr为一个值,区别于地址
dstStr++;
}
for(;*srcStr!='\0';dstStr++,srcStr++){
*dstStr = *srcStr;
}
*dstStr = '\0';
return pStr;
}