(12)C语言---指针(基础)

指针:能够操作内存空间,控制硬件,具有指向的特点

指针与地址的区别和含义:

地址:用来区分不同字节的编号

指针:指针就是地址,地址就是指针,指针具有指向的作用

指针变量:变量中储存的指针 eg: int *p

&运算符和*运算符:

&:获得一个变量的内存空间的首地址 eg:如上图所示,int a 的首地址就为0x2000

注意: 只有变量能够取地址,常量以及常量表达式都不能够取地址

*:获取对应空间中的值

注意:*指针 作为右值是取指针对应空间中的值

eg: *p = 100;(将100赋值给p所指向的空间)

*指针 作为左值是将指针右边的值赋值到指针所指向的空间

eg : num = *p (将p所指向的空间的值赋给num)

指针变量:

  1. 定义形式: 数据类型 *变量名;

eg : int *p ;

char *p ;

double *p;

float *p;

short *p;

  1. 内存形式: 所有类型的指针占8个内存 eg : sizeof(*p);

  1. 指针变量的操作:间接访问内存空间,并且对其进行操作,进行改变赋值等;

直接访问:通过变量名访问变量空间;

间接访问:通过变量在内存中的地址访问变量空间;

  1. 指针变量的初始化:

指针变量如果不初始化,其就为一个野指针

野指针:就是一个被释放的空间或者是一个随机的空间

int *p = NULL;

char *q = NULL;

  1. 指针算数的运算:

++(指针+1 ):向内存高地址偏移指向数据类型大小个字节空间

eg : *(p+1) *(p++) 因为*运算符较高,所以需要带括号

--(指针-1):向内存低地址偏移指向数据类型大小个字节空间

  1. 指针和数组:

eg: int a[5];

int *p = NULL;

p = a;(相当于 p = &a[0])

数组的数组名是指向数组第一个元素的指针常量

数组的访问形式: a[n]==*(a+n)==*(p+n)==p[n]

  1. 指针的字符型数组的关系

数组的数组名是指向数组第一个元素的指针

eg : char a[32] = {"hello world "};

char *p = NULL;

p = a ;

while (*p != 0)

{

p++;

}

练习:

  1. 从终端接收两个数,并定义两个指针分别指向这两个数,利用指针对两个数操作实现四则运算结果的打印

#include <stdio.h>

int main (void)

{

int a = 100 ; int b = 200 ;

int *p = NULL; int *e = NULL;

int num1 = 0 ; int num2 = 0;

int num3 = 0 ; int num4 = 0;

p = &a ; e = &b ;

num1 = *p + *e ;

num2 = *p -*e ;

num3 = *p * *e ;

num4 = *p / *e ;

printf("num1=%d\n",num1);

printf("num2=%d\n",num2);

printf("num3=%d\n",num3);

printf("num4=%d\n",num4);

return 0 ;

}

2.编写一个程序利用指针间隔打印"Computer Science"

输出为:Cmue cec

#include <stdio.h>

int main (void)

{

char a[32] = {"Computer Science"};

char *p = NULL; int i = 0 ;

p = a;

while(*p != '\0')

{

printf("%c\n",*p);

p = p+2;

}

return 0 ;

}

3.从终端接收一行字符串,利用指针遍历字符串统计大写字母、小写字母、空格及数组的个数

#include <stdio.h>

int main (void)

{

char a[32] = {0};

char *p = NULL;

p = a ;

int num1 = 0 ; int num2 = 0 ; int num3 = 0 ; int num4 = 0 ;

int i = 0;

gets(a);

while ( *p != '\0')

{

if(*p >= 'a'&& *p<='z')

{

num1++;

}

if(*p >= 'A'&& *p<='Z')

{

num2++;

}

if (*p == ' ')

{

num3++;

}

i++;

p++;

}

printf("num1=%d\n",num1);

printf("num2=%d\n",num2);

printf("num3=%d\n",num3);

printf("i=%d\n",i);

}

4.从终端接收一个字符串,使用指针对字符串遍历,统计字符串的长度(从开头到\0中间元素个数,不包含\0),不能使用strlen

#include <stdio.h>

int main (void)

{

char a[32] = {0};

char *p = NULL;

int i = 0;

gets(a);

p = a ;

while (*p != '\0')

{

i++;

p++;

}

printf("i = %d\n",i);

return 0 ;

5.从终端接收一个字符串,使用指针操作字符串将字符串拷贝到另一个数组中,不能使用strcpy

#include <stdio.h>

int main (void)

{

char a[32] = {0}; char b[32] = {0};

char *p = NULL; char *e = NULL;

gets(b);

p = a ; e = b;

while (*e !='\0')

{

*p = *e ;

p++;

e++;

}

puts(p);

return 0 ;

}

6.从终端接收两个字符串,使用指针实现两个字符串的拼接,不能使用strcat

#include <stdio.h>

#include <string.h>

int main (void)

{

char a[32] = {0}; char b[32] = {0};

char *p = NULL; char *x = NULL;

int len = 0 ;

gets(a);gets(b);

len = strlen(a);

p = a + len -1 ;

x = b;

while (*x != '\0')

{

*p = *x;

p++;

x++;

}

puts(a);

retrun 0 ;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值