C预言回顾(4)

指针
C语言中另一个重要的模块就是指针,使用指针可以使程序更加简洁,紧凑,高效;但对于初学者来说,这一部分相对难以理解。
当你定义一个变量并在程序编译时,系统会根据变量的类型自动给其分配一定的储存空间,但你要如何寻找这处空间?这时你将需要知道它的地址,而至地址,也就是指针;当程序用型时会给变量分配内存空间,而当程序结束时,这些内存空间会被释放,下一次在运行时,又会分配新的内存空间,所以说,如果你想要找变量的地址,每一次调试时,你会发现,所得出的变量的地址都不相同。

#include<stdio.h>
#include<windows.h>
int main()
{
     int a=1,b=2;
     printf("&a=%5d &b=%5d\n",&a,&b);
     system("pause");
     return 0;
}
第一次调试

在这里插入图片描述

第二次调试
在这里插入图片描述

指针变量
指针就是可以通过地址找变量,那当你通过变量找到了一个地址时,这个变量又该怎么称呼呢,答案就是指针变量;指针变量存放的是一般变量的地址,就如同一个盒子一样,装着其他变量的地址;而指针变量也有自己的地址,所以能通过指针变量的地址找到指针变量;指针变量也是变量,所以也有自己的类型,只有变量与指针变量同类型时,指针变量才能存放该变量的地址。
指针变量的定义:
由指针类型和*及指针变量名组成(int * a)。
如:

#include<stdio.h>
#include<windows.h>
int main()
{
     int  a=1,b=10;
     int *n=&a;int*m=&b;int *t;
     int move1(int *a,int *b);
     printf("a=%d b=%d\n",a,b);
     printf("&a=%5d &b=%5d\n",&a,&b);
     printf("*n=%d *m=%d\n",*n,*m);
     printf("n=%5d m=%5d\n",n,m);
     move1(n,m);
     printf("a=%d b=%d\n",a,b);
     printf("&a=%5d &b=%5d\n",&a,&b);
     printf("*n=%d *m=%d\n",*n,*m);
     printf("n=%5d m=%5d\n",n,m);
     t=n;n=m;m=t;
     printf("a=%d b=%d\n",a,b);
     printf("&a=%5d &b=%5d\n",&a,&b);
     printf("*n=%d *m=%d\n",*n,*m);
     printf("n=%5d m=%5d\n",n,m);
     system("pause");
     return 0;
}
int move1(int *a,int *b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
    return 0 ;
}

在这里插入图片描述

现将变量a,b的地址分别放入指针变量n,m中,并分别输出;经过move函数后,a,b的值交换了,实则交换的是main函数中的a,b;之后将n与m的指针变量交换,也就是说,交换后指针变量这个盒子中的变量的地址相互交换了(交换前,n中存放的是a的地址,m中存放的是b的地址;交换后,n中存放的是b的地址,m中存放的是a的地址);地址是无法交换的,但可以交换存放地址的盒子。

数组指针
一个变量有自己的指针,而一个数组包含多个变量,它的每一个变量也都有自己的指针,而数组整体也有自己的指针;
一维数组:

#include<stdio.h>
#include<windows.h>
int main()
{
     int a[10],b;
     for(b=0;b<10;b++)
     {
           a[b]=b;
           printf("a[%d]=%d  ",b,a[b]);
     }
     printf("\n");
     for(b=0;b<10;b++)
     {
            printf("&a[%d]=%5d  ",b,&a[b]);
     }
     printf("\na=%d\n",a);
     printf("&a=%d\n",&a);
     system("pause");
     return 0;
}

在这里插入图片描述

在一维数组中,数组中每一个元素都有自己的地址,且相邻的两个数组元素地址之差为数组类型所占的字符数;数组名代表数组首元素的地址,而数组的地址代表整个数组的地址,其值等于数组首元素的地址。

二维数组

#include<stdio.h>
#include<windows.h>
int main()
{
     int  n[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
     int a,b;
     for(a=0;a<3;a++)
     {
          for(b=0;b<4;b++)
          {
                 printf("n[%d][%d]=%d  ",a,b,n[a][b]);
          }
     }
     printf("\n");
      for(a=0;a<3;a++)
     {
          printf("\nn[%d]=%d\n",a,n[a]);
          for(b=0;b<4;b++)
          {
                 printf("&n[%d][%d]=%d  ",a,b,&n[a][b]);
          }
     }
     printf("\n");
     printf("n=%d\n",n);
     printf("&n=%d\n",&n);
     system("pause");
     return 0;
}

在这里插入图片描述

二维数组中,如上:n[a]代表数组中a+1行中的首元素的地址,n代表数组的首行地址,其等值与数组首元素的地址,而&n代表整个数组的地址,其值也等于数组首元素的地址。

通过指针引用字符串
一个字符串中的字符地址大小递增,所以只需将首字符的地址放入字符型指针中,就可以将整个字符串的地址找到,并找出相应的字符。

#include<stdio.h>
#include<Windows.h>
int main()
{
	char *a={"I Love China!"};
	printf("a=%p\n",a);
	printf("&a[0]=%p\n",&a[0]);
	printf("&a=%p\n",&a);
	printf("a+2=%p\n",a+2);
	printf("*(a+2)=%c\n",*(a+2));
	printf("*a=%c\n",*a);
	system("pause");
	return 0;
}

在这里插入图片描述

指针a存放的为a[0]的地址,*a=I,a+2为字符串第三个字符的地址,*(a+2)=L,L为字符串第三个字符。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值