知识点
指针的概念
1、地址:内存中每个字节都有一个编号,该编号称为地址
2、变量的地址:变量的地址即变量存放在内存的位置
3、指针变量:专门存放变量的地址的变量叫指针变量
(1)直接访问:按变量地址存取变量值,即直接用变量名访问变量
(2)间接访问:通过存放变量地址的变量去访问地址,即采用指针的方式实现对变量的访问
4、指针变量的定义
格式:数据类型 *指针变量名;
说明:
(1)数据类型是指针的目标变量的数据类型,即可以存放哪种类型变量的地址.
(2)指针变量本身的类型是地址,占2字节,与它指向的目标变量的类型无关.
定义处的“ * ”表示定义指针变量,是类型说明符,不是“ * ”运算符.例如声明int *p;指针变量名是p,而不是 *p.
指向变量的指针
1、基本类型变量指针的获得
指针就是一个变量的地址,指针变量就是存放变量地址的变量.
指针变量的赋值通过取地址运算符“&”实现,间接访问运算通过“ * ”运算符实现.二者互为逆运算.
2、“&”和“ * ”运算符
(1)取地址运算符“&”:取变量的地址.
例如:int i=10,*pointer;
*pointer=&i;//将整型变量i的地址赋给指针变量pointer,则指针变量pointer指向变量i.
(2)间接访问运算符“ * ”:指针运算符,取指针变量所指向变量的内容.
如printf(“i=%d\n”,*pointer);//将i的地址赋值给pointer后,*pointer就是pointer指向的i的内容,即10.
3、指针变量的初始化、赋值
形式:*指针名=初始地址值;
例如:int i,*p=&i;//相当于下列赋值的方式:int i,*p;p=&i;
指向数组的指针
1、指针与一维数组
一个数组是存放在一块连续的内存中的,数组名就是这块连续内存的首地址.
对于一维数组,若有定义 int a[10];则数组名a表示数组的首地址,即a[0]的地址.数组名a是地址常量,不能进行自增或自减运算,或者被赋值.
1)指向数组元素的指针变量的声明、初始化
a[i]=p[i]=*(p+i)=*(a+i);
2、指针与二维数组
若有二维数组的声明 int a[3][4];则
a、a是二维数组的首地址,即第0行的首地址,是指针常量,不能被赋值
b、a+i是第i行的首地址,即&a[i],指向行
c、a[i]即*(a+i),是第i行第0列的元素地址,即&a[i][0],指向列
d、a[i]+j即*(a+i)+j,是第i行第j列的元素地址
a[i][j]=*(a[i]+j)=*(*(a+i)+j)=(*(a+i))[j]
数组指针
定义:( *数组名)[一维数组维数];
例如 int ( *p)[4];
p是一个指向二维数组的指针变量,它指向包含4个元素的一维数组,p的值是一维数组的首地址,p是行指针
3、指针与字符串
char *string;string=“I love China”
或char *string=“I love China”
说明:char str[20];str="I love China"是不允许的,但char str[20]="I love China"可以
易错
指针数组vs数组指针
指针数组 定义形式 int *p[3],p为数组名,是指针常量,数组的元素是指针;
数组指针 定义形式 int(*p)[3],p是指针变量,指向一个二维数组.
程序设计
1、通过指针变量输出某整型数组a[10]的所有元素;统计正数的个数、负数的个数以及零的个数并输出;并输出各类元素之和
【程序设计思路提示】
定义指针int *pa指向数组的首地址,通过指针的移动遍历数组元素,以统计数组中正数、负数以及零的个数。
#include<stdio.h>
int main()
{
int a[10]={1,-4,2,-6,0,3,5,-2,0,7},*pa,i;
int zero=0,zhengshu=0,fushu=0;
for(pa=a;pa<a+10;pa++)
{
if(*pa==0)zero+=1;
else if(*pa>0)zhengshu+=1;
else fushu+=1;
}
printf("zero=%d,zhengshu=%d,fushu=%d\n",zero,zhengshu,fushu);
return 0;
}
2、编写一个判断输入字符串是否为回文的函数,并使用指针形式访问数组元素,同时用main函数调用。
【程序设计思路提示】
定义两个字符指针,p指针指向字符串的第一个字符,q指针指向最后一个字符,比较p和q所指向的内容是否相同,如果相同,则进p从前往后增加1,q从后往前减少1,……,依次类推,如果其中一旦存在不相等的情况,则不是回文串。如果测试完所有字符都相等,则说明是回文串。
#include<stdio.h>
int ispal(char st[],int n);
int main()
{
char str[10];
int flag=0;
scanf("%s",&str);
flag=ispal(str,10);
if(flag)printf("Yes");
else printf("No");
return 0;
}
int ispal(char st[],int n)
{
char *p,*q;
for(p=st,q=st+n-1;p<q;p++,q--)
if(*p!=*q) return 0; /* 0表示字符串不是回文 */
return 1; /* 1表示字符串是回文 */
}
3、【程序功能】
程序从键盘读入若干整数(小于10个),对输入的数据进行从小到大排序,并将排序结果输出到屏幕上。
#include<stdio.h>
#define N 10
void sort(int *a,int n);
void main()
{
int i,n,a[N];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d", &a[i]);
sort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
void sort(int *a,int n) //使用插入排序算法
{
int i,j,tmp;
for(i=1;i<n;i++)
{
tmp=a[i];
for(j=i-1;j>=0&&tmp<=a[j];j--)
a[j+1]=a[j];
a[j+1]=tmp;
}
}
4、设计一个函数copy_string(char *from, char *to) 实现字符串的复制(类似库函数strcpy),同时用主函数调用实现字符串复制。
#include<stdio.h>
void copy_string(char *from, char *to);
int main()
{
char str1[10],str2[10];
scanf("%s",str1);
copy_string(str1,str2);
printf("str1:%s;str2:%s",str1,str2);
return 0;
}
void copy_string(char *from, char *to)
{
for(;*from!='\0';from++,to++)
*to=*from;
*to='\0';
}
5、通过键盘输入10个整数为一个维数组各个元素赋值;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出调整后的数组元素。
#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{
int a[10];
input(a,10);
max_min(a,10);
output(a,10);
return 0;
}
void input(int *arr,int n)
{
int *p,i;
p=arr;
printf("please enter 10 integers:\n");
for(i=0;i<n;i++)
scanf("%d",p++);
}
void max_min(int *arr,int n)
{
int *min,*max,*p,t;
min=max=arr;
for(p=arr+1;p<arr+n;p++)
{
if(*p>*max) max=p;
if(*p<*min) min=p;
}
if(min!=arr)
{
t=*arr;
*arr=*min;
*min=t;
}
if(max!=arr+n-1)
{
t=*(arr+n-1);
*(arr+n-1)=*max;
*max=t;
}
}
void output(int *arr,int n)
{
int *p,i;
p=arr;
printf("The changed array is:\n");
for(i=0;i<n;i++)
printf("%3d",*p++);
printf("\n");
}
6、将一个字符串中第m个字符(第一个字符是第0个字符)开始的全部字符复制成为另一个字符串。
#include<stdio.h>
void strcopy(char *str1,char *str2,int m);
int main()
{
int m;
char *p1,*p2,str1[80],str2[80];
p1=str1;
p2=str2;
gets(p1);
scanf("%d",&m);
strcopy(p1,p2,m);
puts(p1);
puts(p2);
return 0;
}
void strcopy(char *str1,char *str2,int m)
{
char *p1,*p2;
p1=str1+m;
p2=str2;
while(*p1!='\0') *(p2++)=*(p1++);
*p2='\0';
}
7、【程序功能】 已知指针数组name保存了n个字符串的首地址。以下程序通过调整指针数组元素的值实现按字典序对n个字符串排序;输出排序后指针数组各元素指向的字符串。
#include <stdio.h>
#include <string.h>
void sort(char *name[],int n);
void print(char *name[],int n);
int main()
{
int n=5;
char *name[5] = {"Mary","George","Andy","Tom","Iris"};
sort(name,n);
print(name,n);
return 0;
}
void sort(char *name[],int n)
{
char *ptr;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)k=j;
if (k!=i)
{
ptr=name[i];
name[i]=name[k];
name[k]=ptr;
}
}
}
void print(char *name[], int n)
{
int i;
for(i=0;i<n;i++)
printf("%s ",name[i]);
printf("\n");
}