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

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语言部分)之 指针的更多相关文章

  1. GO学习-(10) Go语言基础之指针

    Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数 ...

  2. OC学习3——C语言特性之指针

    1.指针是C语言中的一个非常重要的概念,实际上,OC系统类的变量.自定义类的变量等都是指针.定义指针变量的语法格式如下,其中*代表一个指针变量,整个语法代表定义一个指向特定类型的变量的指针变量.注意: ...

  3. ndk学习之C语言基础复习----指针、函数、预处理器

    指针: 指针乃C.C++的灵魂之所在,所以有必要好好的复习复习.什么是指针?一句话来概括:“指针是一个变量,它的值是一个地址.”,其中指针变量的声明有如下三种形式: 其中第一种是被推荐的写法. 其中还 ...

  4. c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载

    下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...

  5. ndk学习之C语言基础复习----虚拟内存布局与malloc申请

    在这一次中来学习一下C语言的内存布局,了解它之后就可以解释为啥在用malloc()申请的内存之后需要用memset()来对内存进行一下初始化了,首先来了解一下物理内存与虚拟内存: 物理内存:通过物理内 ...

  6. C语言之漫谈指针(上)

    C语言之漫谈指针(上) 在C语言学习的途中,我们永远有一个绕不了的坑,那就是--指针. 在这篇文章中我们就谈一谈指针的一些基础知识. 纲要: 零.谈指针之前的小知识 一.指针与指针变量 二.指针变量的 ...

  7. C语言之漫谈指针(下)

    C语言之漫谈指针(下) 在上节我们讲到了一些关于指针的基础知识: 详见:C语言之漫谈指针(上) 本节大纲: 零.小tips 一.字符指针 二.指针数组与数组指针 三.数组传参与指针传参 四.函数指针及 ...

  8. Swift3.0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

  9. 值得学习的C语言开源项目

    值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...

  10. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

随机推荐

  1. java 实现单向链表

    package cn.com.factroy2; /** * 可以看做是操作链表的工具类,链表的核心结构就是节点的数据结构 * @author wanjn * */ public class Sing ...

  2. win 10 初始环境变量

    有时用户会修改Win10系统的环境变量,改到后面原来是什么的也记不得了,想要改回去还要去别的电脑查看,这里转载下Win10 64位环境变量的默认初始值. 附:打开环境变量方法:电脑左下右键——系统—— ...

  3. SimpleDateFormat的安全问题解决方法

    问题: SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类. 而且SimpleDateFormat ...

  4. OpenStack之queens版本创建负载均衡器时报错问题!

    采用kolla-ansible部署完毕后,创建负载均衡器时会提示如下的报错 解决办法: 修改网络节点的neutron-lbaas-agent容器 进入lbaas容器里 [root@openstack0 ...

  5. SharePoint Framework 构建你的第一个web部件(一)

    博客地址:http://blog.csdn.net/FoxDave SharePoint客户端web部件是出现在SharePoint页面的控件,但却是在浏览器本地运行的.他们是SharePoint ...

  6. L313 珊瑚裸鼠灭绝

    This week the Australian government declared the extinction of a tiny rodent called Bramble Cay melo ...

  7. Ubuntu配置静态IP

    1. 输入命令:sudo vi /etc/network/interfaces 编辑文件: auto lo iface lo inet loopback auto eth0 iface eth0 in ...

  8. centos6.6安装hadoop-2.5.0(六、各种node功能)

    一.hadoop的YARN框架 hadoop的YARN职能就是将资源调度和任务调度分开 ResourceManager全局管理所有应用程序计算资源的分配,每一个job的ApplicationMaste ...

  9. switfmailer 邮件时间错误 处理

    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use ...

  10. python 正则匹配时间格式转换方法

    import re from datetime import datetime a = '2018年8月9日 10:10' s = re.findall('\d+',a) print(s) d = ' ...