iOS笔记:第八篇 C语言 指针
来源:互联网 发布:黑客网络hacknet 攻略 编辑:程序博客网 时间:2024/05/19 04:04
第一节 指 针
1. 指针与指针变量.
1). 指针的定义:指针就是变量的地址.
2). 指针变量:用来存储地址的变量.
3). 指针变量中存储的是另外1个变量的地址.
int num = 12;
指针变量 p1 = num变量的地址.
要操作num变量,通过num变量可以操作,通过p1指针变量也可以操作.
4). 指针变量作用.
可以通过指针变量找到指针变量指向的变量.
2. 指针变量的声明
1). 首先指针是1个变量.
普通变量的声明: 数据类型 变量名;
指针变量的声明: 数据类型 *变量名;
声明注意: * 可以紧跟在类型后面,也可以紧跟在变量名前面.还可以使用空格将其空开.
int *p1; int* p1; int * p1;
2).*代表这个变量不再是1个普通变量,而是1个专门用来存储地址的一个指针变量.
3).指针变量是用来存储地址的.一个指针变量并不是所有的地址都可以存储,而是有限 制的.是由指针的类型来限定的.
int *p1;
这个p1指针变量的类型是int类型的. 这个p1指针变量之中就只能存储 int变量 的地址.
4).指针变量本质上也是一个变量.
-> 指针变量的命名要遵守标识符的命名规则及规范.
-> 指针变量也可以批量的声明.
int *p1,*p2,*p3;
5). 注意:
int *p1;// 这个指针变量的名字叫做p1 不是*p1
3. 指针变量的初始化.
1). 指针变量是用来存储变量的地址的.
-> 不能为指针变量直接赋值一个数据或者变量.(指针变量中只能存储地址)
int *p;
p = 10; //错误写法
int n = 10;
int *p1 = n; //错误写法
-> 在使用变量的时候, 数组名直接拿到数组的地址,其他的变量是拿到变量的值。
2). 指针变量不是任意的地址都可以存储的,由指针的类型来限定.
指针变量是什么类型那么这个指针变量就只能存储这个类型的变量的值.
3). 取变量的地址.
用&取地址运算符.
&变量名. 这个表达式的结果是这个变量的地址.
int n= 10;
&n;
使用格式控制符 %p 输出地址.
4). 初始化指针变量的值.
使用取地址运算符取出变量的地址 然后赋值给指针变量.
int num = 12;
int *p;
p = #
此时,指针变量p中存储的是num变量的地址,p指向了num。
5). 注意:
指针是什么类型的,这个指针变量中就只能存储这个类型的变量的地址.
否则就会发生非常严重的后果
4. 指针变量的使用.
1). 指针变量中存储的是另外1个变量的地址.
int num = 10;
int *p1 = #
printf("%p\n",&num);//打印num的地址
printf("%p\n",p1);//打印p1的地址
指针变量p1的值 是num的地址.
2). 通过指针变量可以访问指针变量所指向的变量.
访问变量的方式:
-> 直接访问 :
int num = 12;
num = 10;
-> 间接访问:
变量可以被一个指针变量所指向,通过指针变量访问.
语法:
*指针变量; 访问到的是这个指针变量指向的变量.
int num = 12;
int *p1 = #
*p1;
*p1 访问的是p1这个指针变量所指向的变量。
此时: *p1 其实就是num
一定要清楚:
p1 访问的是指针变量p1的值.
*p1; 访问的是p1指针变量指向的变量.
3). 举例:
int num = 12;
int *p1 = #
p1 访问的是p1指针变量. p1的值是num的地址.
*p1 访问的是p1这个指针变量指向的变量. 而p1指针变量指向的是num变量.
*p1访问的其实就是num变量.
5. 指针变量使用注意的细节
1). NULL值.
一个指针变量中应该存储另外一个变量的地址. 如果一个指针变量的值赋值为NULL. 代表这个指针变量不指向任何的变量。
int *p1 = NULL;
int *p1 = 0; //和上面一样代表p1指针变量不指向任何变量.
2). 初始化指针变量.
可以将一个指针变量的值赋值给另外一个指针变量.
前提: 指针变量的类型要一致.
多个指针变量可以指向同一个变量.
3). 野指针.
当声明一个指针变量,没有为指针变量赋值,这个指针变量中是有值的为垃圾值.随机值。 这个时候,这个随机的值就有可能指向另外的一块内存了.这块内存有可能没有使 用,也有可能正在被别的程序使用,甚至还有可能被系统在使用.如果这个时候操作这个指针指向的空间,那么就会产生非常严重的后果.像这样的指针叫做野指针, 操作一个 野指针是非常危险的。所以,在声明1个指针变量的时候,如果不确定这个指针变量指向那个空间,一定要为其赋一个初始值 NULL 或者是0
第二节 指针的分类
1. 一级指针:
一个指针变量中存储的是一个普通变量的地址,像这种指针就叫做一级指针.
2. 二级指针:
一个指针变量中存储的是一个一级指针变量的地址, 那么这个指针就叫做二级指针.
3. 二级指针的声明.
1). 一级指针使用一颗*来声明.
二级指针使用两颗*来声明.
2). 二级指针变量只能存储一级指针的地址
int num = 12;
int *p1 = # //这是1个一级指针,一级指针存储普通变量的地址.
int **p2 = &p1; //p2是1个二级指针,二级指针只能存储一级指针的地址.
4. 二级指针的使用
int num = 12;
int *p1 = #
int **p2 = &p1;
*p1 访问num。
*p2 访问p1
**p2 --> *(*p2)--> *p1 --> num
第三节 指针的运算
1. 指针是可以做加减算术运算的.
// int num0 = 1;
// int num1 = 12;
// int num2 = 2;
// int *p = &num2;
// p +=2;
// printf("*p = %d\n",*p);
// p--;
// printf("*p = %d\n",*p);
2. 指针的值 + 1
这个1不是一个字节地址,而是看指针变量是什么类型,以这个类型占的字节数为单位.
int *p = #
p = p + 1; //这个1指的是一个int所占的字节数.
3. 加减数字
并不是加减那么多的字节地址,而是以指针类型为单位. 这个类型的变量占几个字节,那么就以这个占位.
第四节 指针与一维数组
1. 一维数组.
一个一维数组在内存之中是一块连续的字节空间.
int arr[3] = {1,2,3};
从高地址向低地址 连续的分配12个字节空间.
2. 数组的地址问题.
1). 数组的地址是 数组的第0个元素的地址 , 也是数组的第0个元素的首字节第地址.
2). 数组名 就是数组的地址.
3). 数组名 == 数组的地址 == 数组的第0个元素的地址 ==数组的第0个元素的首字节地址
3. 数组元素指针.
如果一个指针指向了数组的元素,那么这个指针就叫做元素指针.
4. 作用:
如果要访问数组的元素可以通过下标来访问,也可以通过指针来间接访问.
5. 更重要的作用
可以使用指针运算,来遍历数组中的每一个元素.
6. 使用指针操作数组和数组中的元素.
int arr[3] = {10,20,30};
a. 第1个非常之重要的问题.
arr这个数组名是一个地址. 是数组的地址
数组的地址 == 第0个元素的地址.
b. 我们可以使用一个指针变量指向数组的元素 。
int *p1 = &arr[0];
int *p1 = arr;
c. 通过指针遍历数组中的所有的元素
1).第一种遍历方式.
int arr[3] = {10,20,30};
int *p1 = arr;
for(int i = 0; i < 3; i++)
{
printf("%d\n",*(p1+i));
}
2). 第2种遍历方式.
使用数组名作为指针来遍历.
int arr[3] = {10,20,30};//arr数组名就是数组的地址.
for(int i = 0; i < 3; i++)
{
printf("%d\n",*(arr+i));
}
3). 第3种遍历方式.
int arr[3] = {10,20,30};
int *p = arr;
for(int i = 0; i < 3; i++)
{
printf("%d\n",*(p++));
}
//每循环1次,指针p的值是在发生变化的.
4). 第四种遍历方式 使用下标来遍历.
d 数组名代表数组的地址, 而数组的地址在数组创建的时候就已经确定。
所以是不能修改数组名,但是可以用.
7. 当数组作为函数的参数的时候. 实际上它并不是1个数组, 本质上是1个指针变量.
- iOS笔记:第八篇 C语言 指针
- ios笔记--C语言指针笔记
- C语言第八章:指针
- C语言第八讲(Pointer指针)
- iOS--C语言指针
- IOS C语言 指针
- C语言‘指针’笔记
- c语言指针笔记
- c语言指针笔记
- C语言指针笔记
- C语言指针笔记
- c语言指针笔记
- C语言指针笔记
- c语言笔记-指针
- 【笔记-C语言】 指针
- 【笔记】C与指针 第八章 数组
- C和指针第八章笔记
- iOS开发学习笔记 2-4 C语言部分 指针
- Sicily 9562. SUME
- sql语句优化
- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat
- c++ 查看库文件符号表
- 黑马程序员——Java基础知识——网络编程
- iOS笔记:第八篇 C语言 指针
- Myeclipse的java工程转web工程
- Linux查看连接数,并发数
- HBase性能优化方法总结
- LeetCode 168: Excel Sheet Column Title
- Eclipse下完整的Servlet实例
- golang interface
- search - binary search
- Java集合中那些类是线程安全的