欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++学习(十七)(C语言部分)之 指针

程序员文章站 2022-04-14 21:52:10
复习 数组定义格式 类型 数组名[数组大小]数组名+下标 int arr[2][3]={{1,2,3},{4,5,6}}; int arr[][3]={1,2,3,4,5,6};//二维数组定义的时候赋值 不能省略列 但可以省略行 内存地址 内存(字节) 每个字节编号(地址) 指针 >存放地址的类型 ......

复习 数组
定义格式 类型 数组名[数组大小]
数组名+下标

int arr[2][3]={{1,2,3},{4,5,6}};
int arr[][3]={1,2,3,4,5,6};//二维数组定义的时候赋值 不能省略列 但可以省略行

 

内存地址 内存(字节) 每个字节编号(地址)
指针--->存放地址的类型 & 取地址 *取值(解引用)

指针定义
类型 *指针的名字 定义指针的格式 (类型 指针保存变量类型的地址)
(point 指针)
指针 可以通过地址修改/访问其他变量值
一般用在 内存申请+函数传参
指针 一般涉及到指针变量一个指向的方向

指针的类型
指针指向的数据的类型
指针--->内存 一条大街 每个字节--->门牌号(地址)
指针就是存放地址的变量

int *p
int 表明p指向一个int类型的变量
int* 表明指针是int*类型

使用过程中 p 表示指针变量 地址
*p 表示指针指向的内容 int
地址不一样 操作不一样
指针存的是什么东西 (地址)
指针如何赋值 如何使用(p *p)
p表示地址 *p是值

指针赋值 赋值变量的地址 &x 得到当前变量的地址
(每次运行的时候 变量地址未必一致)
NULL (特殊规定 指针没有指向任何变量 赋值)
指针 先复制 然后使用
变量没有赋值不能使用 指针没有赋值页不能使用
int x;
printf("%d",x);乱码
规定 如果指针没有指向内容 让指针赋值为NULL (相当于指针的默认值 需要手动赋值)
指针赋值后使用 *p
操作 *p操作指向变量的值

*解引用 只能用于指针
一级指针 int *p/double *p/float *p/char *p

内存的分配 一次程序运行的时候变量分配的地址是不变的
指针很麻烦 并且不实用

指针 1.能不能存值--->
int x;
int *p;
p=1;//操作是错误的 赋值时地址
int*p=x;//x int类型 赋值指针 错误的
p=&x;

指针 2.麻烦
指针去修改变量的值
变量可以通过变量名去修改
有一种情况 不能通过变量名去修改 必须用到指针 函数传参

指针 3.必须使用指针
内存四区 --->定义一个变量 (在内存中分配一块地址)
栈区 (定义变量 定义在栈区) 内存不需要管理 自动分配内存 自动释放 (缺点 栈溢出 大概只有4M空间 再大就管理不了) 例如arr[1000000000000];
堆区 (手动申请 手动释放 必须用指针操作) 手动确定数组大小(动态数组) 堆区
全局静态常量区 存放全局变量 静态变量 常量 (比栈区大)
代码区 (存放代码二进制)
函数里面定义的变量 在栈区
堆区 用函数申请释放
全局变量 放在main函数外面 在函数外部定义的变量
静态 static 修饰的变量
字符串常量---->存放在常量区 常量 数据不能修改

 

 C++学习(十七)(C语言部分)之 指针

 

 

 1 #include<stdio.h>
 2 #include<stdlib.h>//srand rand sysytem malloc free
 3 int main()
 4 {
 5 #if 0
 6     
 7     int x = 0;//定义变量 赋值
 8     //取到x的地址
 9     int *p;//定义  定义变量
10     p= &x;//赋值   给指针赋值
11     printf("%p\n",p);//打印p的值(地址)
12     *p = 20;//修改的x 操作*p和操作x 用指针去修改另外一个变量的值
13     if (p == NULL)
14     {
15         //说明指针没有指向任何内容 不能使用 *p 
16     }
17     printf("%p\n",p);//打印p的值(地址)
18     printf("%p\n",&x);//打印地址 格式占位符%p
19     //假设需要申请一块空间 存放int   malloc(sizeof(int)*1);//申请内存 返回一个地址 必须用指针保存 ()里面是申请的内存的大小 一般搭配sizeof 返回一个地址 括号里面的数字 表明大小 单位是字节
20     //malloc 内存申请 分配多少空间
21 
22     //使用时和数组一样
23     int*q = (int*)malloc(sizeof(int)* 100);
24     *q=2;//操作第一个int *(q+n) 操作第n+1个int *(q+0)~*(q+99)
25     q[0] = 2;//q[n]相当于 *(q+n) 
26     for (int i = 0; i < 100; ++i)
27     {
28         *(q + i) = i;//通过指针 使用堆内存
29         //或者 q[i]=i;
30         printf("%d",*(q+i));
31     }
32     //q[100];//越界
33     //*(q+100);//越界
34     int*myPoint = (int*)malloc(sizeof(int)*x);//内存申请 数组在堆区 大小 是由变量来决定的 动态数组
35     //int arr[100];//数组大小必须是常量  静态数组
36 
37     free(q);//堆区内存必须要手动释放
38     free(myPoint);
39     while (1)
40     {
41         malloc(sizeof(int)*1000);
42     }
43 #endif
44 
45 #if 1
46     char mystr[] = "hello world";//mystr 数组 栈区
47     char *pstr = "hello world";//pstr定义的是指针 保存的是地址 保存的是字符串的地址
48     //char*pstr="hello world";//常量区 内容不能修改
49     //pstr = "hello world";//字符串的地址赋值给了pstr
50     mystr[0] = '1';
51     //pstr[0] = '1';//用指针修改了常量区的内容 所以会报错
52     //*(pstr+0)='1';
53 
54 #endif
55 
56     getchar();
57     return 0;
58 }

 

 

 

1.指针 定义格式 int*p int表示p要指向的内容(p保存的变量的地址) *表示这是指针 p表示指针的名字
使用方式 赋值 用地址给指针赋值(需要一个额外的变量)
使用 *p 代表p指向的内容

2.内存四区
栈区
堆区
全局静态常量区(全局区)
代码区

3.特殊指针用法
堆区的内存申请释放 malloc free 头文件 stdlib.h
char*p="hello"和char arr[]="hello"的区别

注意事项 1.指针使用的时候必须向赋值然后使用
2.指针只能赋值地址
3.内存申请必须释放 不释放会占内存 直到重启
4.定义指针int*p
p相当于地址 *p相当于指向的内容
5.不同类型指针不能互相赋值 (类型不一样 操作也不一样)
//除了malloc 不考虑任何强转

 

 

 

2018-07-20   10:29:29