2020.10.22 13课 指针(二)const指针数组 数组指针

一指向常量的指针与指针常量

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\n",*(p+1)); 加一就代表了int类型跳动了4个字节

(2)printf("%d\n",p[1]);
例二
int Map[5]={100,200,30,400,500};
double* p=(double*)Map;
printf("%d\n",*(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]);

隐藏资源到图片中 hide show del
posted @ 2020-11-11 23:13  鹤儿哈  阅读(190)  评论(0编辑  收藏  举报