c语言指针

目录

1、什么是指针

2、指针变量

3、指针与数组

 4、一些例题

参考书籍《算法笔记》


1、什么是指针

我们可以理解指针就是变量的地址(哈哈哈,这样不太严谨),那么,我们怎样获得变量的地址呢?我们可以用取地址运算符&,只要在变量前加上&,就表示变量的地址。

例如定义一个int a的整形变量,&a就表示它的地址。

指针是一个unsigned类型的整数。

2、指针变量

指针变量用来存放指针(或者可以理解成地址),存放变量的地址。一般在某种数据类型后加星号*来表示这是一个指针变量。

例如:

int* p;

double* p;

char* p;

注意:星号“*”的位置在数据类型之后或是变量名之前都是可以的。

正如上面所说,指针变量存放的是地址,而&则是取地址符,因此给指针变量赋值的方式一般是把变量的地址取出来,然后赋给相应类型的指针变量:

int a;

int* p=&a;

也可以写成:

int a;

int *p;

p=&a;

这里我们注意一下:int *是指针变量的类型,而后面的p才是变量名,用于存储地址,因此地址&a是赋给p而不是*p。我们只要记住星号是类型的一部分。

那么,对于一个指针变量存放的地址,如何得到这个地址所指的元素呢?其实还是用星号*,假设定义了int* p=&a;那么指针变量p就存放a的地址。为了通过p来获取变量a,可以把星号*视为一把开启房间的钥匙,将其加在p的前面,这样*p就可以把房间打开,然后就可以得到变量a的值。

示例如下:

#include<stdio.h>
int main()
{
  int a;
  int* p=&a;
  a=21;
  printf("%d",*p);
  return 0;
}

输出结果为:21

由此我们可以想到,即使p保存的是地址,*p是这个地址中存放的元素,那么我们可以直接对*p进行赋值,也可以起到改变那个保存的元素的功能,就像下面这个例子:

#include<stdio.h>
int main()
{
  int a;
  int* p=&a;
  *p=21;
  printf("%d, %d",*p, a);
  return 0;
}

输出为:21 21

另外,指针变量也可以进行加减法,其中减法的结果就是两个地址偏移的距离。对一个int*型的指针变量p来说,p+1是指p所指的int型变量的下一个int型变量的地址。除此之外,指针变量支持自增自减操作,因此p++等同于p=p+1使用。指针变量的加减法一般用于数组中,下面有例题哟。

3、指针与数组

数组名称也作为数组的首地址使用。示例如下:

#include<stdio.h>
int main()
{
    int a[10]={1};
    int* p=a;
    printf("%d",*p);
    return 0;
  
}

1

根据指针变量可以进行加减法,我们可以知道 a+i 等价于 &a[i],要注意的是 a+i 其实只是地址,所以我们要访问其中的元素a[i],需要加上星号,使其变成*(a+i)后才和a[i]等价。由此我们可以得到一种输入数组元素的一种新颖的方法。

scanf("%d",a+i);

那来道例题

好嘞

#include<stdio.h>
int main()
{
	int a[5];
	for(int i=0;i<5;i++)
	scanf("%d",a+i);
	for(int i=0;i<5;i++)
	printf("%d ",*(a+i));
	return 0;
 } 

我们输入5个数组元素:1 2 3 4 5

结果为:

上学校网课截的图:

 4、一些例题

常见的指针例题当然是两数指针交换啦

#include<stdio.h>
int main()
{
  void swap(int *p1,int *p2) ; 
int a,b;
int *pointer_1,*pointer_2;
printf("Please input two numbers:\n");
scanf("%d,%d",&a,&b); 
pointer_1=&a;
pointer_2=&b;
if(a<b)
swap(pointer_1,pointer_2); 
printf("After exchanged:\n"); 
 printf("\n%d,%d\n",a,b); 
  return 0;
}

/*定义函数,形参为指针*/
void swap(int *p1, int *p2)
{int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}

还有数组的一题

#include <stdio.h>
        #include  "string.h"
        void  fun ( char *w,  int  m )
        {  char  s, *p1 , *p2 ;
           p1=w;   p2=w+m-1;
           while(p1<p2)
           {   s=*p1++;   *p1=*p2-- ; *p2=s;    }
         }
        main( )
        {  char    a[ ]="1234567";
           fun ( a , strlen(a) );
           puts(a);
        }

结果为

 这一题我们要知道的知识点是:

*p++等同于*(p++)。就是先把p所对应地址处的值取出来,然后在让p++。

然后在字符串与指针中,字符数组与字符指针的比较

 字符指针中 a=I am a boy !,*a=I 哦。

其实指针还有好多内容,比较繁琐,需要我们在练习中多多揣摩。加油!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白小白,一定发财。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值