C++学习(十七)(C语言部分)之 指针
复习 数组
定义格式 类型 数组名[数组大小]
数组名+下标
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 修饰的变量
字符串常量---->存放在常量区 常量 数据不能修改
#include<stdio.h>
#include<stdlib.h>//srand rand sysytem malloc free
int main()
{
#if 0 int x = ;//定义变量 赋值
//取到x的地址
int *p;//定义 定义变量
p= &x;//赋值 给指针赋值
printf("%p\n",p);//打印p的值(地址)
*p = ;//修改的x 操作*p和操作x 用指针去修改另外一个变量的值
if (p == NULL)
{
//说明指针没有指向任何内容 不能使用 *p
}
printf("%p\n",p);//打印p的值(地址)
printf("%p\n",&x);//打印地址 格式占位符%p
//假设需要申请一块空间 存放int malloc(sizeof(int)*1);//申请内存 返回一个地址 必须用指针保存 ()里面是申请的内存的大小 一般搭配sizeof 返回一个地址 括号里面的数字 表明大小 单位是字节
//malloc 内存申请 分配多少空间 //使用时和数组一样
int*q = (int*)malloc(sizeof(int)* );
*q=;//操作第一个int *(q+n) 操作第n+1个int *(q+0)~*(q+99)
q[] = ;//q[n]相当于 *(q+n)
for (int i = ; i < ; ++i)
{
*(q + i) = i;//通过指针 使用堆内存
//或者 q[i]=i;
printf("%d",*(q+i));
}
//q[100];//越界
//*(q+100);//越界
int*myPoint = (int*)malloc(sizeof(int)*x);//内存申请 数组在堆区 大小 是由变量来决定的 动态数组
//int arr[100];//数组大小必须是常量 静态数组 free(q);//堆区内存必须要手动释放
free(myPoint);
while ()
{
malloc(sizeof(int)*);
}
#endif #if 1
char mystr[] = "hello world";//mystr 数组 栈区
char *pstr = "hello world";//pstr定义的是指针 保存的是地址 保存的是字符串的地址
//char*pstr="hello world";//常量区 内容不能修改
//pstr = "hello world";//字符串的地址赋值给了pstr
mystr[] = '';
//pstr[0] = '1';//用指针修改了常量区的内容 所以会报错
//*(pstr+0)='1'; #endif getchar();
return ;
}
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
C++学习(十七)(C语言部分)之 指针的更多相关文章
- GO学习-(10) Go语言基础之指针
Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数 ...
- OC学习3——C语言特性之指针
1.指针是C语言中的一个非常重要的概念,实际上,OC系统类的变量.自定义类的变量等都是指针.定义指针变量的语法格式如下,其中*代表一个指针变量,整个语法代表定义一个指向特定类型的变量的指针变量.注意: ...
- ndk学习之C语言基础复习----指针、函数、预处理器
指针: 指针乃C.C++的灵魂之所在,所以有必要好好的复习复习.什么是指针?一句话来概括:“指针是一个变量,它的值是一个地址.”,其中指针变量的声明有如下三种形式: 其中第一种是被推荐的写法. 其中还 ...
- c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载
下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...
- ndk学习之C语言基础复习----虚拟内存布局与malloc申请
在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ...
- C语言之漫谈指针(上)
C语言之漫谈指针(上) 在C语言学习的途中,我们永远有一个绕不了的坑,那就是--指针. 在这篇文章中我们就谈一谈指针的一些基础知识. 纲要: 零.谈指针之前的小知识 一.指针与指针变量 二.指针变量的 ...
- C语言之漫谈指针(下)
C语言之漫谈指针(下) 在上节我们讲到了一些关于指针的基础知识: 详见:C语言之漫谈指针(上) 本节大纲: 零.小tips 一.字符指针 二.指针数组与数组指针 三.数组传参与指针传参 四.函数指针及 ...
- Swift3.0语言教程使用指针创建和初始化字符串
Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...
- 值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
随机推荐
- MakeFile中export的使用
在shell中,可以使用export修改当前进程的环境变量. 例如:export PATH=.:$PATH 将当前路径加入可执行文件查找路径(PATH)中,这样你就不要敲“./excutable” 来 ...
- 【Eclipse使用】在eclipse里添加源文件和Api的方法
一.源代码添加 你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击 ...
- daay04流程控制之for循环
for循环主要用于循环取值 student=['egon','虎老师','lxxdsb','alexdsb','wupeiqisb'] # i=0 # while i < len(student ...
- Uva LV 2995 Image Is Everything 模拟,坐标映射,视图映射 难度: 1
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- MarkDown编辑器中缩进
首先,Markdown是不支持缩进的. 在Markdown里按下四个空格,就自动转入Code模式. 在Markdown里一个回车,不是分段而是换行,要两个回车,才是分段. 分段和换行的区别是:换行后, ...
- 六. Python基础(6)--语法
六. Python基础(6)--语法 1 ● Python3中, Unicode转字节的方法 print(bytes("李泉", encoding = 'utf-8')) prin ...
- jQuery $.each()常见的几种使用方法
<code class="language-html"><!doctype html> <html> <head> <meta ...
- DevExpress WPF v18.2新版亮点(三)
买 DevExpress Universal Subscription 免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第 ...
- Linux(centos) 下curl模拟Http get / post请求 [ curl ]
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http:// ...
- CodeForces ~ 996
Allen has a LOT of money. He has nn dollars in the bank. For security reasons, he wants to withdraw ...