C语言丨指针

知识点

指针的概念

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值