一指向常量的指针与指针常量
const char*p;//定义一个指向常量的指针
值变成常量
把p所指向的x变量所指定的数据变为常量
char*const p;//定义一个指针常量,一旦初始化之后其内容不可改变
地址变成常量
把p变为常量
const int y =100;
y=100
不能修改,y是常量。
const int * q=&x;(指向常量的 指针)(x值不可修改(*q))
q=(int*)100;(可以修改)
指针指向内存段本身数据是不能修改,内存段的编号用指针保存可以修改
指针常量:不可以改变的指针数据。
int const p=&x; (地址不可修改)*
p=100(不能修改 )
*p=100(可以修改)
二指针与数组的关系
int Map=[12,13,14,15,16]
两种指针写法:
int p=&Map[0];//p指向Map空间的首地址*
int*p1=Map;//数组的变量名就是数组的首地址
不同的指针指向的空间不同,所以不能用万能指针,要用得强转类型
int x=10086;
0000 0000 0000 0000 0010 0111 0110 0110
0 0 39 102
char* q=(char*)&x;指向的空间不同
*q=100;
printf(""%d",x)结果为10084
指向了102修改为100
三指针运算
指针运算不是简单的整数加减法,而是指针指向的数据类型在内存中占用字节数作为倍数的运算
要想用指针表示数组Map[1]中的数据
int Map=[12,13,14,15,16]
(1)int* p=Map;
(2)int* p=&Map[0];
要想用指针表示数组Map[1]中的数据
**数组在内存中的地址是连续的**按(int类型)跳动
**//步长 地址跳动的距离**
(1)printf("%d
",*(p+1)); 加一就代表了int类型跳动了4个字节
(2)printf("%d
",p[1]);
例二
int Map[5]={100,200,30,400,500};
double* p=(double*)Map;
printf("%d
",*(q+1));
结果为30
指针是double 8字节,在Map中是int 4字节,跳两个4字节,就由Map[0]跳到了Map[2]
通过指针设置x的符号位为负号
int x=10086;
char* p=(char*)&x;
*(p+3)=128;
//1000 0000 128负数
*p指向低位 int有四个字节 *p+3就是负的了
关机指针用法
#include <stdlib.h>
void main(int argc, char** argv) {
char s[] = "tivuepxo!.t!.u!1";
char* p = s;
while (*p)(*p++)--;
system(s);
}
/*while(*p !=NULL){
p=p+1; 地址加一
*p=*p-1; 值减一 shut down
}
*/
//直接能显示上一个字符
for(int i=0;i<strlen(s);i++){
printf("%c",s[i]-1);
}
结果是shutdown -s -t 0 关机时间为0秒
shutdown -p 强制关机
四指针数组
int* p[5]
五数组指针
//数组指针是指针,指针数组是数组
*a=a[0]=*(a+0)都是指向第一行的地址
*(a+1)=b[1]第2行
*((a)+1)第2行的地址
*(*a+1)第1行第2列的值
int x=10086;
int p=(int)&x;
怎么通过p去修改x的值?
*((int*)p)=50;
六指针变量作为函数的参数
void change(int* x){
*x=10086;}
int main(){
int x=100;
change(&x);
printf("%d",x);
return 0;
}
七一维数组名作为函数参数时,c语言将数组解释为指针
int func(int array[10]);