指针和数组
数组名是数组首元素地址。
int arr[]={1,2,3,4,5}
int* p;
p=arr;
printf("%d\n",p+1); //指针+1是+sizeof(int)
(arr+i)与arr++
两个指针相减得到的是步长,即偏移量,如int 类型
void BubbleSort(int arr[])
{
int len=sizeof(arr)/sizeof(arr[0]);
printf("%d\n",len); //len=1或2 //64位指针为8字节
}
指针拷贝
void strcpy(char* dest,char*ch)
{
int i=0;
while(ch[i])
{
dest[i]=ch[i];
i++;
}
dest[i]=0;
}
void strcpy(char* dest,char* ch)
{
while(*ch){
*dest=*ch;
dest++;
ch++;
}
*dest=0;
}
while(*dest++=*ch++);
指针操作数组时下标允许是负数
指针加乘除取余没有意义。
指针数组
//定义数组 数据类型 数据名[元素个数] ={值}
int a=10,b=20,c=30;
int* arr[3]={&a,&b,&c}; //打印arr[0]=10
指针数组是一个特殊的二维数组模型
int a[]={1,2,3};
int b[]={4,5,6};
int c[]={7,8,9};
int* arr[]={a,b,c};
...
printf("%d\n",arr[i][j]);
printf("%d\n",*(arr[i]+j));
printf("%d\n",*(*(arr+i)+j));
多级指针
//接上面代码
int** p=arr;
printf("%p\n", *p); //地址
printf("%d\n", **p); //1
printf("%d\n", *(*p+1)); //2
printf("%d\n", **(p+1)); //4
printf("%d\n", *(*(p+1) + 1)); //5
值传递与地址传递
参考C语言注意
//值传递 C++
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<" "<<b<<endl;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<" "<<y<<endl;
return 0;
}
//指针传递
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<*a<<" "<<*b<<endl;
}
int main(){
int x=1;
int y=2;
swap(&x,&y);
cout<<x<<" "<<y<<endl;
}
//引用传递
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<" "<<b<<endl;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<" "<<y<<endl;
return 0;
}
int x=1;
int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值
int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样
数组名作为参数
int main()
{
char ch1[100]="hello";
char ch2[]="world";
}
void my_struct(char *ch1,char *ch2)
{
while(*ch1) ch1++;
while(*ch1++=*ch2++) ;
}
字符串去空格
int main()
{
char ch[]="h el l o";
}
void remove(char* ch)
{
char* ftmp=ch; //遍历字符串
char* rtmp=ch;//非空格字符串
while(*ftmp)
{
if(*ftmp!=' ')
{
*rtmp=*ftmp;
rtmp++;
}
ftmp++;
}
*rtmp=0;
}
指针做为函数返回值
char* my_strchr(char* str, char ch)
{
while(*str)
{
if(*str==ch)
{
return str;
}
str++;
}
return NULL;
}
int main()
{
char str[]="hello world";
char* p=my_strchr(str,'o');
if(p==NULL)
{
printf("不存在");
}else
{
printf("%s\n",p);
}
}
字符串查找
char* mystrstr(char* src,char* dst)
{
char* fsrc=src; //遍历
char* rsrc=src; //记录相同首地址
char* tdst=dst;
while(*fsrc)
{
rsrc=fsrc;
while((*fsrc == *tdst)&&(*fsrc!=0))
{
fsrc++;
tdst++;
}
if(*tdst==0) return rsrc;
tdst=dst; //如果不对,重新到目标起始位置
fsrc=rsrc; //回滚到源地址
fsrc++;
}
return NULL;
}
int main()
{
char src[]="hello world";
char dst[]="llo";
char* p=mystrstr(src,dst);
printf("%s\n",p);
}