c语言保姆级笔记八-指针

指针(又称为指针变量,是c语言, c++, objective c 特有的, 指针用好了非常方便,如果用不好,也会造成不好的后果)

内存

计算机的程序都是在内存中执行的,每个内存都有一个地址,地址是32位,4字节

int a = 10;

&a ----> a的地址

如果定义一个变量保存 a的地址,就用指针变量

int *p; //*指针定义运算符

p = &a; //相当于p是指向a的一个指针

1 指针定义(用来保存一个地址的变量,叫指针变量)

1) 指针也是一个变量(可以保存信息)

2) 指针保存的是一个地址

int*p; //* 指针定义运算符, p是一个指针,保存的是一个地址

2 指针赋值

p= &a;

3 如何通过指针变量p访问变量a

*p= 20; //* 取内容运算符, 到p指向的地址处赋值

在c语言里,获取变量的值有两种方式

int a = 10;

1) 直接赋值,直接给某个变量赋值

a = 20; //通过名字找到a,并且赋值

2) 间接赋值, 先取出某个变量的地址,然后到那个地址去赋值

int *p = &a;

*p = 20; //分为两步1 取出p的值,就是a的地址 2 到那个地址去赋值(20)

举例:

#include <stdio.h>

int main()

{

inta = 10;

int*p; //类型 int *

p= &a; //int *p = &a; //定义指针时,直接初始化为&a

printf("ais %d, *p is %d\n", a, *p); //10,10

printf("&ais %p, p is %p\n", &a, p); //%p 表示输出一个地址

*p= 20;

printf("ais %d, *p is %d\n", a, *p); //20,20

}

练习

//定义一个浮点型变量 x = 1.1

//定义一个浮点型指针变量 q

//把浮点型变量x地址赋值给 q

//通过q改变x的值 3.14

//打印x, *q

#include <stdio.h>

int main()

{

floatx = 1.1;

float*p = &x; //p ????? p 是一个指针,类型 float *

printf("xis %.2f, *p is %.2f\n", x, *p);

*p= 3.14;

printf("xis %.2f, *p is %.2f\n", x, *p);

}

1 指针就是一个变量(变量里面保存的是一个地址(int float double))

有了指针变量我们就可以利用地址来访问一个变量 (*p = 20)

2 指针变量初始化

int*p = &a; //定义指针变量时直接初始化 (int *p; *p = 20; )

指针和数组

怎么定义指针变量,指向一个数组

int a[5] = {10, 20, 30, 40, 50};

int *p = a; //int *p; p = a;

*p <=====> a[0]

*(p + 1) <=====> a[1]

*(p + 2) <=====> a[2]

*(p + 3) <=====> a[3]

*(p + 4) <=====> a[4]

举例子通过指针访问数组

直接访问

#include <stdio.h>

int main()

{

inta[5] = {10, 20, 30, 40, 50};

int*p = a;

printf("%d,%d, %d, %d, %d\n", *p, *(p + 1), *(p + 2), *(p + 3), *(p + 4));

}

循环方式

#include <stdio.h>

int main()

{

inta[5] = {10, 20, 30, 40, 50};

int*p = a, i;

for(i= 0; i < 5; i++)

{

printf("%d\n",*(p + i));

}

}

///用指针,求学生成绩和,平均值并打印,学生成绩放到一个数组中

int a[] = {90, 80, 70, 60, 75, 87, 89,92};

//求出学生成绩和,和平均值

#include <stdio.h>

int main()

{

inta[] = {90, 80, 70, 60, 75, 87, 89, 92};

int*p = a; //int *p; p = a;

inti, sum = 0;

for(i= 0; i < 8; i++) //for(i = 0; i <sizeof(a) / sizeof(a[0]); i++)

{

sum+= *(p + i);

}

printf("sumis %d, avg is %d\n", sum, sum / 8);

}

sizeof(a) / 4 = 8 //sizeof(a) ? 32

sizeof(a) / sizeof(int) = 8

sizeof(a) / sizeof(a[0]) = 8

指针和函数

可以将数组传递给一个函数,如果将数组传递给函数通常传递数组名

#include <stdio.h>

void print_a(int *p, int n) //void print_a(int p[],int n)

{

inti;

for(i= 0; i < n; i++)

{

printf("%d\n",*(p + i));

}

}

int main()

{

inta[5] = {10, 20, 30, 40, 50};

print_a(a,5); //将输出a写成一个函数,那么需要将a做成参数

}

函数使用指针接收数组

练习

1 写一个函数求5个学生的平均成绩(在函数中求学生平均成绩, 在主程序中打印)

#include <stdio.h>

int get_avg(int *p, int n)

{

inti, sum = 0;

for(i= 0; i < n; i++)

{

sum+= *(p + i);

}

returnsum / n;

}

int main()

{

inta[] = {90, 80, 70, 60, 50};

intavg = get_avg(a, 5);

printf("avgis %d\n", avg);

}

2 写一函数my_strlen,求一个字符串的长度,

使用如下main函数

#include <stdio.h>

int my_strlen(char *p)

{

inti = 0;

while(*(p+ i) != '\0') //p[i]

{

i++;

}

returni;

}

int main()

{

chara[] = "hello";

intx = my_strlen(a);

printf("xis %d\n", x); //5

}

3 编写一个函数,将数组中n个数按反顺序存放

使用如下main函数

#include <stdio.h>

void reverse(int *p, int n)

{

inti;

for(i= 0; i < n / 2; i++)

{

intt = *(p + i);

*(p+ i) = *(p + n - 1 - i); //a[0]<--> a[7] a[1] <--> a[6]

//p[i]= p[n - 1 - i]; //指针可以像访问数组一样写 p[1] === *(p + 1)

*(p+ n - 1 - i) = t;

}

}

int main()

{

inti, a[] = {1,2,3,4,5,6,7,8};

reverse(a,8); //

for(i= 0; i < 8; i++)

printf("%d\n",a[i]); //8 7 6 5 4 3 2 1

}

作业1:

写一个函数,打印

*

***

*****

*******

*********

阶数可由参数传递

5 阶

空格个数是第一次 4, 第二次 3, n - i - 1

* 个数 2 * i + 1

作业:2 字符串拷贝 mystrcpy(char *dst, char *src);

int main()

{

chara[] = "hello";

charb[100] = { 0 };

mystrcpy(b,a);

///输出b "hello"

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值