1.指针的含义:是数据类型且是存放地址的变量
定义格式: 数据类型 *指针名,int *p;
指针的获取:&变量名
int *p=&a;(p存储的是a的地址,*p是a的地址里面的值(*p==a),&p表示自身的地址)
2.指针的作用是:存储地址且可通过地址访问该地址空间的数据(可以修改数据)
3.运算时编译器会创建一个临时空间,结束时空间就释放了
4.语法就是编译器的规则
5,*跟类型数据名表示是定义了一个变量,指针本身有空间的
6,*修饰是什么,就表示是什么指针,判断原则:先确定数据类型(看优先级)
7.指针是什么类型的,就要存什么类型的地址,否则*p取对应内存空间的值会出错
8,指针没被赋值之前不要用*p,因为它分配的地址是随机的,既里面的值是随机的
指针与数组
指针数组:存储指针的数组int *p[5];
/*指针与数组的关系*/
#include <stdio.h>
int main(){
/*指针的基本用法
//定义:类型 *指针名;
int *p;
//赋值:p=&变量名;
int a=0;
p=&a;
//操作.*指针变量名==变量名.操作指针所指向空间的数据.要么取出数据*p;
*p=10;//修改里面的值.
*/
/*
一,什么是指针数组?
表示一个数组,用来存指针的数组就叫指针数组.数组里面的元素都是指针.
如:int *p[3];表示定义一个可以存三个int指针的数组.
赋值: int a1=1,a2=2,a3=3; int *p[3]={&a1,&a2,&a3};
取值: int *a=p[0];
//定义一个指针数组
int *p[3];
int a1=1,a2=2,a3=3;
//创建三个指针(int型)
int *p1=&a1;
int *p2=&a2;
int *p3=&a3;
//给数组赋值
p[0]=p1;
p[1]=p2;
p[2]=p3;
//取值
int *ptemp=p[0];å
printf("p1=%p,ptemp=%p\n",p1,ptemp);
*/
/*
二.什么是数组的指针?
表示一个指针,而这个指针类型是数组.
如:int (*p)[3];表示这是一个含有三个元素的int数组的指针.
赋值:int arr[3]={1,2,3}; int (*p)[3]=&arr;
//定义:固定写法.一定要加括号,不然变量p先与[]结合.成数组了.
int (*p)[3];
//赋值
int arr[3]={2,3,4};
p=&arr;
//arr是表示一个数组,里面包含第一个元素的地址.arr=&arr[0]
printf("数组的地址:&arr=%p,数组第一个元素的地址:&arr[0]=%p,arr=%p\n",&arr,&arr[0],arr);
int *p1=arr;
//取值操作
printf("%d\n",(*p)[2]);//\*pd等效于arr;
(*p)[2]=8;
printf("%d\n",(*p)[2]);//arr[0]
*/
/*
三.什么是数组元素的指针?
表示一个指针,而这个指针存的是数组一个元素的地址.
如:int arr[1]={1}; int *p=&arr[0];
*/
int arr[1]={1};
//定义并赋值
int *p=&arr[0];
//操作数据
printf("*p=%d,arr[0]=%d\n",*p,arr[0]);
return 0;
}
地址一旦被取,就是一个指针了,如果没有命名就是匿名指针(&a就是一个指针)
数组指针:存储数组的指针int (*p)[3]
特点
指针只能加减运算,地址的移动(如果移动了一位,就是移动了该指针数据类型的字节数*(p+1)),
如果是数组,*(P+1)移动的是整个数组字节数的字节数
/*指针与数组的特点*/
#include <stdio.h>
int main(){
/*
2.指针可以运算.但仅限于加减运算.运算的实质就是地址运算.即地址的移动.
int arr[3]={1,2,3};
int *p=arr;//int *p=&arr[0]
int a=*p;
//a=*(p+1);//等效于:int *p1=&arr[1]; a=*p1;
int *p1=&arr[1];
a=*(p1+1);//p1的值并没有改变.
printf("p1=%p\n",p1);
p1=p1+1;//赋值之后才改变了
printf("p1=%p\n",p1);
a=*(p1-1);
printf("%d\n",a);
*/
/*
3.地址(+1)向高位移动,而(-1)向低位移动.
不同指针类型移动一位(+1或-1)的字节数不同.
4.实际移动的字节数看指针类型,类型占多少个字节,一位就移动多少个字节.
char arr[3]={'a','b','c'};
char *c=&arr[1];//char *c=arr;
//printf("c=%p\n",c);
//printf("%c\n",*c);
//c=c+1;
//c=c-1;
//printf("c=%p\n",c);
//printf("%c\n",*c);
//\*(c+1)等效于:c[1+1]
//(*注意)仅当指针c为第一个元素指针时可以与arr互换.
printf("%c\n",arr[3]);//数组越界会有警告
printf("%c\n",c[2]);//指针只管移动,不管是否越界
*/
/*指针的运算移动时,只在在内存区域内不受限制*/
int b=2;
int a=0;
int *p=&a;
printf("%d\n",*p);
p=p+1;
printf("%d\n",*p);
}
用指针取出来的值是该指针的数据类型,在CPU中是计算机机器语言
数组名表示第一个元素的地址,&数组名是整个数组的地址,两者的值是相同,但意义不同
把*p去掉,剩下的部分就是类型
指针也有指针名[移动数量],等效于*(P+移动数量)
指针不受限制,随便怎么移动
指针与二维数组
字符串与指针
内存泄露:创建的变量使用后,内存,没被释放
指针定义的字符串是常量,不能被改变,而字符数组定义,字符串数组利用的是用一个
指针型函数:函数的返回值是指针;int *add(int *P){}没有多级指针
函数指针:是指针,函数会在内存开辟一块空间,函数指针既这块空间的地址
char arr[2][3]={2,5,4,4,5,6} |
|