主要内容
1、什么是指针,指针的作用是什么?
2、指针的类型
3、指针的值
4、指针指向的值(区域)
5、指针的运算
6、指针和数组
7、指针和函数
1、什么是指针,指针的作用是什么?
定义:指针是一个变量,这个变量只能存地址,指针变量占据8个空间字节
作用:在函数之间传递数据(>1的多个数据)给调用者
*
的用法:
1、定义的时候表明是一个指针变量
2、使用的时候,表示 取地址的值(或指针指向的区域的值)
e.g
int temp = 10;
int *p = &temp; //定义指针变量
*p = 20; //取地址的值
&
作用:取地址
2、指针的类型
1、判断指针类型的一个简单方法:去掉
*
和变量名,就是指针的类型
2、指针变量只能指向同种数据类型的地址
e.g
int *p;//整型指针
char *p;//字符指针
int (*func)(int);//函数指针
3、
1、普通指针常量e.gint *pa;
2、常量指针(常量不变,指针指向的值是不能变的)
e.g
int a = 20;
int b = 30;
int const *pa = &a;//常量指针
*pa = 50;//错误,不能改变指针指向的变量的值
pa = &b;//正确,可以改变指针的指向
3、指针常量(数组就是指针常量的一个例子)
(指针不能变,永远指向某一个类型的数据)
int b = 30;
int a = 20;
int * const pb = &a;
*pb = 50;//正确,可以改变指针指向的变量的值
pb = &b;//错误,不能改变指针的指向
4、指向常量的常量指针(既不能改变指针指向的变量的值,又不能改变指针的指向)
int a = 20;
int b = 30;
int const * const pc = &a;
*pc = 50;//错误,不能改变指针指向的变量的值
pc = &b;//错误 ,不能改变指针的指向
3、指针的值
就是指向的内存空间的首地址
4、指针指向的值(区域)
一级指针:指向一个普通变量
int a = 20;
int *pa = &a;
二级指针:指向一个地址
int a = 20;
int *pa = &a;
int * *pb = &pa;
int ** *ptemp = &pb;
1、访问a的值的方法:
a = 30;
*pa = 30;
**pb = 30;
***ptemp = 30;
2、访问pb的值方法:
pc;
*ptemp;
5、指针的运算
指针是一个用数值表示的地址,可以对指针执行算术运算:++ -- - +
e.g
int num[] = {1,2,3,4,5,6,7,8,9};
*(num+1) = 20
//将num[2]的值改为20
*(num++) = 20
//错误 原因:数组是一个指针常量,数组的指向不能改变即等价于不能对指针名进行运算
(*num)++ = 20;
//错误 原因:2 = 20;
6、指针和数组
数组名:num就是数组的首地址(打印地址 %p),数组名本身没有
分配内存空间
,
sizeof(num)
计算整个数组的内存空间,数组是一片连续的内存空间
指针
只是一个变量(存地址)
两者的共同点
数组也可以用指针的方式访问
访问第一个元素
num[0] = 20;
*num = 20;
访问第二个元素
num[1] = 30;
*(num + 1) = 30;
*num + 1 = 30;
//错误 1+ 1 = 30;
注:
1、在指针中,若不确定运算符优先级的情况下,加圆括号,来分清结合方式
2、数组是一个指针常量,指针的指向不能改变(即不能对数组名进行运算)
7、指针和函数
指针的作用:通过指针间接访问某个内存
定义一个函数,什么情况下参数是指针?
这个函数会不会改变传递过来的数据本身,若需要改变外部的值,就将该变量定义为指针变量
e.g改变int型变量的值
#include <stdio.h>
void test(int *pa, int *pb){
(*pa)++;
(*pb)++;
}//通过指针存储地址,通过指针就可以直接改变指向的变量的值,就不需要返回值
int main(){
int a = 20;
int b = 30;
test(&a, &b);
printf("a:%d, b:%d",a,b);
return 0;
}
e.g改变数组中各个元素的值,分别加1
注:
1、函数接收数组时,必须知道数组元素个数,函数里面是通过指针变量来接收数组的地址,指针变量无法确定指向的内容的大小
2、访问数组的两种方式
a、num[3];
b、*(num + 3);
#include <stdio.h>
//void test2(int p[], int count)
void test2(int *p, int count){
for(int i = 0; i < count; i++){
(*(p+i))++;
//p[i]++;
}
}
int main(){
int num[5] = {1,2,3,4,5};
for(int i = 0; i < 5; i++){
printf("%d ",num[i]);
}
printf("\n");
test2(num,5);
for(int i = 0; i < 5; i++){
printf("%d ",num[i]);
}
return 0;
}