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;
}