//
// main.c
// 指针基本概念 #include <stdio.h> // 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值不会影响到外面实参的值
void change(int value) // int value = 10;
{
value = ;
printf("哥被执行了\n");
} // 数组作为函数的参数是地址传递, 如果是地址传递在函数中修改形参的值会影响到外面实参的值
void change2(int values[])
{
values[] = ;
printf("哥被执行了\n");
} // 指针就是专门用于保存地址的
void change3(int *p) // 用什么接收地址? 指针 = 0ffc13 int *p = &num;
{
*p = ;
printf("哥被执行了\n");
} int main(int argc, const char * argv[]) {
// 需求: 定义一个函数, 在函数中修改传入的实参的值 int num = ;
printf("修改前:num = %i\n", num);//
change(num);
printf("修改后:num = %i\n", num);// int nums[] = {, };
printf("修改前:nums[1] = %i\n", nums[]);//3
// nums == &nums == &nums[0]
change2(nums);
printf("修改前:nums[1] = %i\n", nums[]);// int num = ;
// *p == num
printf("修改前:num = %i\n", num);//
change3(&num);
printf("修改后:num = %i\n", num);// /*
如何定义指针变量
普通变量:
数据类型 变量名称; 指针变量:
数据类型 * 变量名称; 数据类型 : 说明将来指针变量能够保存什么类型的变量的地址
注意: 指针变量是什么类型, 那么将来就只能保存什么类型变量的地址,
例如: 指针变量是int类型, 那么将来就只能保存int类型变量的地址
* : 没有任何特殊含义, 仅仅是为了标示这是一个指针变量
变量名称 : 用于区分不同的变量 */ int num; // 普通变量
num = ; int *p; // 指针 , 在64位编译器下占用8个字节
// 千万注意: 指针变量只能存储地址
p = &num; // 将num的地址存储到p这个指针中 // p == &num
printf("num = %p\n", &num);//num的地址,0xff90c
printf("p = %p\n", p);//p里面的值,0xff90c // 指针变量前的*号代表访问指针变量指向的那一块存储空间
// *p == num
*p = ;
printf("num = %i\n", *p); return ;
}
//
// main.c
// 指针练习1
//
// Created by xiaomage on 15/6/12.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> void swap(int *v1, int *v2)
// int *v1 = &a, int *v2 = &b; v1 = 0ffc13 v2 = 0ffc9
// *v1 == a *v2 == b
{
int temp = *v1; // int temp = 0ffc13
*v1 = *v2;
*v2 = temp;
} int main(int argc, const char * argv[]) {
// 定义一个函数交换两个变量的值
int a = ; // 0ffc13
int b = ; // offc9
printf("交换前:a = %i, b = %i\n", a, b);
// int temp = a;
// a = b;
// b = temp;
swap(&a, &b);
printf("交换后:a = %i, b = %i\n", a, b);
return ;
}
//
// main.c
// 指针练习2 #include <stdio.h>
//int demo(int v1, int v2, int v3);
int demo(int v1, int v2, int v3, int *p1, int *p2); int main(int argc, const char * argv[]) {
// 要求定义一个函数, 传递三个值, 返回这三个值得和,差,平局值
int a = ;
int b = ;
int c = ;
//int res = demo(a , b , c);
printf("res = %i\n", res); // 定义三个变量用于保存计算结果
int res1 = ; // 和
int res2 = ; // 差
int res3 = ; // 平局值 // *p1 == res1 *p2 == res2
// 我们想要的就是调用完函数之后, 和差平均值对应的变量都被"修改"为对应的值
int res3 = demo(a, b, c, &res1, &res2); printf("和 = %i, 差 = %i, 平均值 = %i\n", res1, res2, res3); return ;
} int demo(int v1, int v2, int v3, int *p1, int *p2)
{
int sum = v1 + v2 + v3;
*p1 = sum;
int m = v1 - v2 - v3;
*p2 = m;
int average = sum / ; return average; // 因为返回的是一个逗号表达式, 而逗号表达式的值是最后一个表达式的值, 所有返回的是average
// return sum, m, average; // return 连个作用 1.返回值给调用者 2.结束函数
// 注意点: return后面不可以写任何语句, 因为执行不到
return sum;
printf("--------------\n");
return m;
return average; }
//
// main.c
// 指针的注意点 #include <stdio.h> int main(int argc, const char * argv[]) {
// 1.指针只能保存地址
int *p = ;
printf("%i\n", *p); // 2.同一个变量可以有多个指针指向它
int num = ;
int *p = &num;
// *p == num
// num = 55;
*p = ;
int *p1 = p;
*p1 = ;
int *p2 = &num;
printf("%i\n", *p);//100 // 3.指针的指向可以修改 int a = ;
int b = ;
int *p = &a;
*p = ;
p = &b;
*p = ;
printf("%i\n", a);//
printf("%i\n", b);//44 // 4.不要访问野指针
// 没有赋值的指针, 我们称之为野指针
int *p;
int *p = NULL; // 0,不赋值就赋初值为null,
printf("%i\n", *p); // 5.指针类型是什么类型, 就只能指向什么类型的数据 int num = ;
char charValue = 'l';
double doubleValue = 9.9; // int *p = &num;
// int *p = &charValue;
// int *p = &doubleValue; double *p = &doubleValue;
printf("%lf\n", *p); return ;
}
//
// main.c
// 多级指针
//
// Created by xiaomage on 15/6/12.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) { char charValue = 'l';
// 1.拷贝需要指向的变量的数据类型和变量名称
// 2.在数据类型和变量名称之间加上一颗星
// 3.修改变量名称
char *charValueP;
charValueP = &charValue; // 1.拷贝需要指向的变量的数据类型和变量名称
// 2.在数据类型和变量名称之间加上一颗星
// 3.修改变量名称
char **charValuePP; // 不管有几颗*只要是指针变量就占用8个字节
printf("size = %lu\n", sizeof(charValuePP));
charValuePP = &charValueP; charValue = 'j';
*charValueP == charValue
*charValueP = 'j'; &charValue == charValueP
printf("&charValue = %p\n", &charValue);
printf("charValueP = %p\n", charValueP);
&charValueP == charValuePP
printf("&charValueP = %p\n", &charValueP);
printf("charValuePP = %p\n", charValuePP); // *charValuePP == 0ffc14 == charValueP
// *pp == p // **charValuePP == *(*charValuePP) == *charValueP == 0ffc14 == l
**charValuePP = 'n'; printf("%c\n", **charValuePP); char c = 'a';
char *cp;
cp = &c;
char **cpp;
cpp = &cp;
char ***cppp;
cppp = &cpp;
printf("cppp = %c\n", ***cppp); /* *cp == c;
*cpp == cp;
**cpp == *(*cpp) == *cp == c
多级指针的操作, 最简单的方式, 就是通过几颗星来存储, 就通过几颗星来访问
还有一种方式就是画图, 看图片中有几个箭头, 有几个简单就用几颗星来访问
*/
printf("c = %c\n", c);
printf("*cp = %c\n", *cp);
printf("&c = %p\n", &c);
printf("cp = %p\n", cp);
printf("*cpp = %p\n", *cpp);
printf("**cpp = %c\n", **cpp); return ;
}
//
// main.c
// 指针为什么要分类型
//
// Created by xiaomage on 15/6/12.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) { char *cp;
int *ip;
double *dp;
double **dpp;
// mac系统中的指针无论是什么类型, 几级真正都占用8个字节
// 由于Mac是64位了所以是8个字节,32位就是4个字节了, 32 = 4 * 8;(4个字节*每个字节占8位) 64 = 8 * 8;(8个字节*每个字节占8位)
printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));//8,8,8,8 // 指针为什么要分类型?
// 因为当我们利用指针去取值的时候(指针只是首地址,不知道数据类型就不知道从首地址取多长), 系统就会自动根据指针的类型来确定应该取对少个字节中的值
int intValue = ; //
char charValue = '';
/*
00110001
11001110
00000100
00000000 00000000 00000100 11001110 00110001
*/ int *charValueP;
charValueP = &charValue; printf("%i\n", *charValueP);
printf("%i\n", 0b00000000000001001100111000110001); /*
11001110
*/
char *p = &intValue;
printf("%i\n", *p); return ;
}

c17---指针的更多相关文章

  1. C的指针疑惑:C和指针17(经典抽象数据类型)

    堆栈这种数据最鲜明的特点是:后进先出. 用动态数组实现堆栈: #include "C17.h" #include <stdio.h> #include <stdl ...

  2. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  3. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  4. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  5. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  6. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  7. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  8. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  9. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  10. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

随机推荐

  1. 7.union

    联合结果集union 简单的结果集联合: select number,name,age from emp union select cardnumber,name,age from emp2 基本的原 ...

  2. W3C标准冒泡、捕获机制

    (一) 捕获和冒泡如何相互影响 我们来做几个任务吧! 有一个前提,#parent为标签,#child为子标签,他们是嵌套关系支线任务1 //捕获模式 document.getElementById(' ...

  3. 易企CMS主要模板文件介绍

    article.tpl 文章内容页模板 catalog.tpl 文章,产品目录页模板 category.tpl 分类页模板 comment.tpl 留言页模板 footer.tpl 页尾模板 head ...

  4. List 练习

    (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double sa ...

  5. Deutsch lernen (04)

    1. streng a. 严厉的,严格的 streng gegen sich selbst und gegen andere sein streng auf Ordnung halten 2. ver ...

  6. (转)Arcgis for js加载天地图

    http://blog.csdn.net/gisshixisheng/article/details/44494715 综述:本节讲述的是用Arcgis for js加载天地图的切片资源. 天地图的切 ...

  7. jq 跨域请求

    //使用getJSON <script type="text/javascript"> $(function () { $("#btn2").cli ...

  8. springboot 多数据源的实现

    相关的依赖 yml配置 java配置类: DataSourceConfigurerjava /** * Created by zhiqi.shao on 2017/11/20. */ @Configu ...

  9. NFS网络文件系统方案

    1,关闭防火墙和selinuxiptables -Fsystemctl stop firewalldsystemctl disable firewalldsetenforce 0 服务器系统    名 ...

  10. BZOJ 3943: [Usaco2015 Feb]SuperBull 最小生成树

    Code: // luogu-judger-enable-o2 #include<bits/stdc++.h> #define setIO(s) freopen(s".in&qu ...