赞
踩
1.指针的定义:指针本质就是一个变量,而这个变量永远只能存储一个内存地址(编号),所以此变量对应的专业术语叫指针变量, 通过指针变量保存的地址就可以对这块内存区域任意访问(读查看,写修改), 而指针指向的内存区域可以保存一个数字,而这个数字有数据类型。
2.指针针变量分配的内存空间为4字节或者8字节,所以指针变量本身没有数据类型,只是它指向的内存区域保存的数字有数据类型
3.指针变量定义的语法格式:
书写形式1:
指针变量指向内存区域存储数字的数据类型 * 指针变量名=初始化值;
书写形式2:
指针变量指向内存区域存储数字的数据类型* 指针变量名=初始化值;
书写形式3:
指针变量指向内存区域存储数字的数据类型 *指针变量名=初始化值;
1.指针变量初始化通过取地址&来进行
2.就是通过指针变量对指向的内存区域读查看或者写修改
语法格式:
*指针变量
野指针
没有初始化的指针变量,它保存着一个随机地址,指向着一块无效的内存
因为这块内存区操作系统并没有给你分配,如果多野指针进行非法操作
也会造成程序的崩溃
#include <stdio.h>
int main(void){
int *p; //野指针
*p=100;
printf("%d\n",*p); //程序崩溃
return 0;
}
空指针
空指针变量保存一个空地址,用NULL表示,其实就是编号为0地址
空指针不可以随意访问,否则造成程序的崩溃
#include <stdio.h>
int main(void){
int *p=NULL;
*p=100;//程序崩溃
peintf("%d\n",*p);
return 0;
}
a)指针可以和一个整数做加减法运算:简称地址运算
b)计算的结果和指针指向的变量数据类型有关系
c)指针计算:
char类型指针+1,实际地址+1
short类型指针+1,实际地址+2
int类型指针+1,实际地址+4
long类型指针+1,实际地址+8
例如
//假设0x1000是指针变量存储的地址 char *pa=0x1000; short *pb=0x1000; int *pc=0x1000; long *pd=0x1000; pa++; //实际地址加1 pa==0x1001; pb++; //实际地址加2 pb==0x1002; pc++; //实际地址加4 pc==0x1004; pd++; //实际地址加8 pd==0x1008
1.数组名就是数组的首地址,同样准寻指针的运算公式
2.数组名+2也是第2个元素的首地址
”[]“运算符要经过两步运算:
1.先算地址
2.再取值
例如
#include <stdio.h> int main(void){ int a[5]={1,2,3,4,5}; int *pa=a; int len=sizeof(a)/sizeof(a[0]); //形式1: for(int i=0;i<len;i++){ printf("%d\n",*(pa+i)); } //形式2 for(pa=a;pa<a+len;){ *pa++ *=10; //先取内容,后算地址 } //形式3: pa=a; for(int i=0;i<len;i++){ printf("%d\n",pa[i]); } return 0; }
A.常量定义:不可修改的值
B.常量关键字:const
C.const关键字功能:常量化
1.常量:const可以修饰普通变量,一旦修饰,该变量就会被当成常量处理,
既其值一经初始化再也不能修改
2.常量指针:不能通过指针变量来修改指向的内存区域的值
3.指针常量:指针永远指向一块内存区域,不能再指向其他内存区域
4.常量指针常量:不能通过指针变量来修改指向的内存区域的值,并且永远指向一块内存区域,不能再指向其它内存区域,只能查看内存区域的值
例如
#include <stdio.h> int main(void){ const int a=100; //将普通变量常量化,其值无法修改 //a=200; //报错 //定义并初始化常量指针,指针变量指向的内存区域存储的值无法修改 const int *pa=&a; //*pa = 300; //报错 int b=200; pa = &b; //定义并初始化指针常量 int *const pb=&a; //pb = &b; //报错 *pb = 200; //定义并初始化常量指针常量 const int *const pc=&b; //*pa = 300;//报错 //pc = pb;报错 return 0; }
A.无数据类型指针(void*)概念:它也是一个指针变量,也保存一个地址,同样占4字节内存只是它指向的内存区域的数据类型是不可知的,称这种指针为无数据类型指针
B.无数据类型指针(void*)特点:
1.通过此种指针变量是无法获知指向的内存区域保存的数据的数据类型
2.不能直接对无数据类型指针进行解引用操作"",因为你不知道指向的内存区域的数据类型,也就是不知道将来要取几个字节的数据,如果要想通过无数据类型指针获取内存的数据必须做数据类型的转换(强转)
3.无类型指针void加减几,实际地址就是加减几
例如
#include <stdio.h> int main(void){ int a=0x12345678; void *pa=&a; //如果我们不知道指向内存存储的数据是什么数据类型 pa++;//实际地址加1 pa--;//实际地址减1 char *p1=(char *)pa; printf("%d\n",*(p1++)); printf("%d\n",*(p1++)); printf("%d\n",*(p1++)); printf("%d\n",*(p1++)); //或者 printf("%#x\n",*(char*)(pa+0)); printf("%#x\n",*(char *)(pa+1)); printf("%#x\n",*(char *)(pa+2)); printf("%#x\n",&(char *)(pa+3)); short *p2=(short*)pa; printf("%d\n",*(p2++)); printf("%d\n",*(p2++)); //或者 printf("%#x\n",*(short *)(pa+0)); printf("%#x\n",*(short *)(pa+1)); int *p3=(int *)pa; printf("%d\n",*(p3++)); //或者 printf("%d\n",*(int *)(p+0)); return 0; }
1.指针作为函数的形参,函数通过指针能够访问操作指向的内存
2.指针作为函数的返回值,此类函数又称指针函数,也就是函数的返回值是一个指针,将来函数返回的是一个地址,跟返回的变量的内存生命周期相关,跟变量的使用范围无关
3.语法格式:返回数据类型* 函数名(形参表){函数体语句}
例如
#include <stdio.h> extern void swap(int *const,int *const); extern char *string(void); int main(void){ int a=100,b=200; swap(&a,&b); printf("%d %d\n",a,b); printf("%s\n",string()); return 0; } /*指针作为函数形参*/ void swap(int *const pa,int *const pb){ int n=*pa; *pa = *pb; *pb = *n; } /*指针作为函数的返回值*/ int *string(void){ char a[]="hello,china"; return a; }
#include <stdio.h> #include <stding.h> int main(void){ int a[5]={1,2,3,4,5}; int len1=sizeof(a)/sizeof(a[0]); print(a,len); char str_b[]="hello,china"; int len2=strlen(str_b); string(str_b,len2); return 0; } void string(const char a[],int len){ for(int i=0;i<len;i++){ printf("%c ",a[i]); } } void print(int *pa;int len){ for(int i=0;i<len;i++){ printf("%d ",*(pa+i)); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。