C语言知识点五 ——指针和数组

C语言学习笔记(五)

指针和数组

数组名是数组首元素地址。

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);
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值