C语言学习笔记【指针入门篇】
指针的定义
指针是能存放一个地址的一组存储单元(通常是2-4个字节)
&取变量/数组元素的地址
*作用于指针时,将访问指针所指向的对象
int a,*p;//先定义变量,再定义指针
*p=&a;//定义后立刻赋值
或
char a;
char *p=&a;
要点
- 指针与所指向变量 类型一致
- 先定义变量,再定义指针(定义后及时赋初值)
指针应用场景(指针与函数参数)
- 优点:生成代码更高效紧凑
实现某种计算的唯一途径
指针变量:
作实参时–地址传递
形参时,接收地址
通过共享地址 实现大量数据“相互传递”
int main()
{
void func(char*)//函数声明指针名称可缺省
}
/*子函数定义时指针名称不可缺省*/
void func(char*p)
一:指针用于交换变量
C语言是以传值的方式将参数值传给调用函数的,故swap函数不可直接交换函数值
swap函数–交换
#include <stdio.h>
void swap(int *pa,int *pb)
{
int t;
t=*pa;
*pa=*pb;
*pb=t;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
swap(&a,&b);
printf("%d %d",a,b);
}
指针参数使得被调用函数能访问和修改主调函数种对象的值
二:指针用于函数返回多个值
1.传入的参数实际上是需要保存带回的结果
tips:求int型数组长度
常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。
#include <stdio.h>
void minmax(int a[],int len,int *min,int *max)
{
int i;
*min=a[0];
*max=a[0];
for(i=1;i<len;i++)
{
if(a[i]<*min)
{
*min=a[i];
}
if(a[i]>*max)
{
*max=a[i];
}
}
}
int main()
{
int max,min;
int i,n,len;
int a[]={1,23,534,232,23,1443,34,76,57,3,6,8};
len=sizeof(a)/sizeof(a[0]);
minmax(a,len,&min,&max);
printf("%d %d",min,max);
}
任意输入数组时
主函数
int main()
{
int max,min;
int i,n,len;
scanf("%d",&n);
int a[50];//数组长度为50
for(i=0;i<n;i++)
scanf("%d",&a[i]);//实际赋了n个值
minmax(a,n,&min,&max);//易错:查询最值时len为n
printf("%d %d",min,max);
}
2.返回函数的运行状态(同时返回计算结果)
if () 的条件表达式,要求一个 bool 值; 但是C通常用 整数类型,表示 bool 值,0 表示 false,非0表示true
#include <stdio.h>
int divide(int a,int b,int *result)
{
if(b==0)
return 0;//若除数为0,返回0指程序出错,不能执行
else
{
*result=a/b;
return 1;//返回1指除法成功执行
}
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int c;
if(divide(a,b,&c))//检查divide函数返回值--非0则为true
printf("%d",c);
else
printf("Division by zero is not allowed");
return 0;
}
数组和指针
通过数组下标能完成的任何操作都可以用指针来实现
指针编写程序比数组更快,但可能较难理解
-
int *a与int a[] 等价(更习惯用前者)
-
int *p=&a[0]与int *p=a 等价
(数组名所代表的就是数组最开始元素的地址) -
数组变量本身表达地址
所以 int a[10],int *p=a;
无需用&取地址 -
数组单元表示的是变量
需要用&取地址 -
p[0]<==>a[0]
-
数组和指针可以被赋值
*p=26;//正确 -
数组变量不能被赋值
const和指针
- const int*p=&i;
指针所指变量不能被修改
*p=26//正确 - int *const p=&i;//指向方向不变
int const *p=&i;//定值
int const *const p//定值+定向
tips:const在 左定值 右定向
指针的运算
(地址偏移运算)
*p++
取出p所指的数据,之后将p移到下一个位置
运算 p+i 等同于 p+i*N(指向对象储存字节数)
int a[10],*n;
for(n=a;n<a+10;n++)//指针起始指向a[0],到a[9]
scanf("%d,n);//注意,此处输入a[i]的值
for(n=a;n<a+10;n++)
{
if(*n>'a'&&*n<'z')//*n为指针指向的普通变量
*n=*n-'a'+'A';
}
实际问题
最值查询
输入N及N个整数元素
找出其最大值和最小值
#include <stdio.h>
int main()
{
int N;
scanf("%d",&N);
int list[N];
int *p=list;//指针定义后尽快赋值
int i;
for(i=0;i<N;i++)
scanf("%d",p+i);//或直接scanf("%d",p[i])
int max,min;
max=list[0];
min=list[0];
i=0;
do
{
if(p[i]>max)
max=p[i];//p[i]等同于list[i]
if(*(p+i)<min)
min=*(p+i);
i++;
}while(i<N);
printf("%d %d",max,min);
return 0;
}
最值交换
找到最大值最小值并交换
#include <stdio.h>
int main()
{
int N;
scanf("%d",&N);
int b[N];
int *s;
for(s=b;s<b+N;s++)
scanf("%d",s);
int max,min,max_p,min_p;
max=b[0];
min=b[0];
max_p=0;
min_p=0;
int i=0;
for(s=b;s<b+N;s++)
{
if(*s>max)
{
max=*s;
max_p=i;
}
if(*s<min)
{
min=*s;
min_p=i;
}
i++;
}//此过程中,指针指向地址发生偏移
s=b;//指针变量的值需要重置
int t;
t=*(s+max_p);
*(s+max_p)=*(s+min_p);
*(s+min_p)=t;//交换位置
for(i=0;i<N;i++)
{
printf("%d",b[i]);
if(i!=N-1)
printf(" ");
}
return 0;
}
最值间元素个数
找出最大最小值及最值间跨越元素个数
#include <stdio.h>
int main()
{
int N;
scanf("%d",&N);
int c[N];
int *p=c;
int i;
for(i=0;i<N;i++)
scanf("%d",&c[i]);
int max,min;
max=c[0];
min=c[0];
int *max_p=c;
int *min_p=c;//指针变量赋值
for(i=0;i<N;i++)
{
if(p[i]>max)
{
max=p[i];
max_p=c+i;
}
if(p[i]<min)
{
min=p[i];
min_p=c+i;
}
}
printf("%d %d %d",max_p-c,min_p-c,abs(max_p-min_p)-1);
}
字符删除
删除数字和空格字母
#include <stdio.h>
#include <string.h>
void delet(char *a)
{
char b[100],*i,*j=b;
for(i=a;*i!='\0';i++)
{
if((*i<'0'||*i>'9')&&*i!=' ')
{
*j=*i;
j++;
}
}
*j='\0';
i=b;
puts(i);
}
int main()
{
char str[100],*p=str;
gets(str);
delet(p);
return 0;
}
指定字符插入
在字符串的指定位置插入指定字符
#include <stdio.h>
#include <string.h>
void insert(char a[],char c,int N)
{
char*i,*j;
int l=strlen(a);
for(i=a;i<=a+l;i++)
{
if(i==a+N)
{
for(j=a+l;j>a+N;j--)//倒循环方便插入
*j=*(j-1);//元素依次后移
*j=c;//插入元素
break;
}
}
i=a;
puts(i);
}
int main()
{
char str[100],*p=str;
gets(str);
char ch;
int N;
scanf("%c%d",&ch,&N);
insert(p,ch,N);
return 0;
}