指针(又称为指针变量,是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"
}