C语言-指针应用

1.指针数组与数组指针

指针数组:重点在数组,数组中每个元素都是指针;
数组指针:重点在指针,指数组的指针;

#include<stdio.h>
int main()
{
	int a[]={1,2,3};
	int *p[]-{a,&a[1],a+2};		//定义指针数组
	printf("a[1]=%d\n",*p[1]);
	printf("a[2]=%d\n",*(*(p+2)));
	return 0;
}

2.值传递

#include<stdio.h>
void swap(int m,int n)
{
	int temp;
	temp=m;
	m=n;
	n=temp;
}
int main()
{
	int a=10;
	int b=20;
	printf("a=%d,b=%d\n",a,b);
	swap(a,b);
	printf("a=%d,b=%d\n",a,b);
	return 0;
	/*经过对比可以发现,实参a,b没有发生任何变化,仅仅是形参进行值得传递*/
}

3.地址传递

#include<stdio.h>
void swap0(int *m,int *n)
{
	int temp;
	temp=*m;
	*m=*n;	//指向指针指定的内容
	*n=temp;
}
int main()
{
	int a=10;
	int b=20;
	printf("a=%d,b=%d\n",a,b);
	swap0(&a,&b);	//传递到形参的是实参的地址
	printf("a=%d,b=%d\n",a,b);
	return 0;
	/*经过对比可以发现,实参a,b发生交换,不仅仅是形参进行值得传递*/
}

4.形参中的数组

形参中的数组相当于指针,不具有具体数组的特性;

#include<stdio.h>
void sort_array(int a[],int n)	//	这里的数组等价于a[100],*a
{
	int i;
	int j;
	int temp;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(a[j]<a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
}

void print_array(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
}

int main()
{
	int b[]={2,3,1,-3,9,0,8,-7,-3};
	int n=sizeof(b)/sizeof(b[0]);
	print_array(b,n);
	sort_array(b,n);
	print_array(b,n);
	/*对数组b进行排序并打印*/
	return 0;
}

5.返回局部变量的地址

局部变量的地址由于调用的函数在调用之后会自动释放,所以相当于只读,不能进行写入操作;

#include<stdio.h>
int *fun()
{
	int a=10;
	return &a;
}
int main()
{
	int *p=fun();
	printf("a=%d\n",*p);
}

6.返回全局变量地址

全局变量定义在大括号之外,知道所有程序结束才进行释放;
全局变量可以随便用;

#include<stdio.h>
int a=10;
int *fun()
{
	return &a;
}
int main()
{
	int *p=fun();
	printf("a=%d\n",*p);
	*p=100;
	printf("a=%d\n",*p);
	return 0;
}

7.字符串常量与字符串变量

字符串常量为只读:

#include<stdio.h>
int main(int argc,char *argv[])
{
	char *p="hello";		//这里返回的是字符串常量的首元素地址
	p=NULL;				//指针变量可以修改
	//*p='a';			error "hello"没有赋值给定义的变量,为字符串常量,所以不可改变
	return 0;
}

字符串变量可以进行读写:

#include<stdio.h>
int main(int argc,char *argv[])
{
	char a[]="hello";	//这里“hello”不是字符串常量,可以进行读写
	char *p=a;
	*p='a';				//运行结果:"aello"
	return 0;
}

8.main函数的形参

argc 是传递参数的个数;
*argv 是传递参数的指针数组;

#include<stdio.h>
int main(int argc,char *argv[])
{
	int i;
	for(i=0;i<argc;i++)
	{
		printf("Out[%d]=%s\n",i,argv[i]);
		//运行结果:Out[0]=./a.out
	}
	return 0;
}

9.查找字符串出现次数

要用到strstr()函数,进行字符串的位置查找;

#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char p[]="136217abcdasdagdyabcd32abcdasdsa";
	char *temp;
	int n=0;
	while(1)
	{
		temp=strstr(p,"abcd");
		if(temp==NULL)
		{
			break;
		}
		else
		{
			n++;
			p=p+sizeof("abcd");	//更新p指向的位置
		}
	}
	printf("字符串出现次数:%d\n",n);
	return 0;
}

10.两头堵模型

#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
	char a[]="         12435446         ";
	int n=sizeof(a);
	char *start=a;						//定义初始指针
	char *end=a+n-1;					//定义结束指针
	int i;
	for(i=0;i<n;i++)					//循环操作去除字符串中的空格
	{
		if(*start==' '&&*start!=0)
		{
			start++;
		}
		if(*end==' ')
		{
			end--;
		}
	}
	char b[100];
	n=end-start+1;						//计算处理后字符串长度
	strncpy(b,start,n)					//对处理后字符串进行复制
	b[n+1]=0;							//添加结束符
	printf("处理后的字符串:%s\n",b);	//输出结果12435446
 	return 0;
}
发布了55 篇原创文章 · 获赞 11 · 访问量 2616

猜你喜欢

转载自blog.csdn.net/zuefeng/article/details/102233544