c 指针(一)
一:什么是指针
变量i 的存储地址为P(假设为2000),*P 为指针变量
一个变量的地址称为该变量的“指针”。如果有另一个变量专门存放另一变量的地址(指针),则它称为“指针变量”。
指针是一个地址,指针变量是存放地址的变量。
二:指针变量
int a =1,b=2;
int *p1;
p1=&a;//P1为指针变量 不可以写成*p1=&a;(*p1是变量a的值)
int *p2=&b;//可以同时定义和初始化
注:一个变量的指针:1.以存储单元编号表示的地址。2,指向存储单元的数据类型(int char...)
指向整型数据的指针类型 int*,读作,指向int 的指针 或 int指针
指针变量应用实例:swap
#include<stdio.h>
void swap(int *point1,int *point2);
int main()
{
int a =1,b=2;
int *p1,*p2,*p;
p1=&a;p2=&b;
printf("a=%d b=%d\n",a,b);
printf("p1=%d p2=%d\n",p1,p2);
swap(p1,p2);//p=p1;p1=p2;p2=p;可以实现swap
printf("a=%d b=%d\n",*p1,*p2);
printf("p1=%d p2=%d\n",p1,p2);
return 0;
}
void swap(int *point1,int *point2)
{
int *p;
p = point1;
point1 = point2;
point2 = p;
}
结果:a,b的值并没有改变
在函数调用时,p1的值传给point1,p2的值传给point2,执行完swap后,point1与point2的值是互换的,但并未影响到p1,p2。在函数结束时,变量point1和point2释放了。main函数中的p1,p2并未互换。也就是说,由于“单向传送”的“值传递”方式,形参值的改变不能使实参的值随之改变。
void swap(int *point1,int *point2)
{
int temp;
temp = *point1;
*point1 = *point2;
*point2 = temp;
}
结果 :a,b值互换,p1,p2地址没换。
main()
{
swap(a,b);
}
void swap(int x,int y)
{
int p;
p = x;
x = y;
y = p;
}
结果:x,y 的值会变,但是,ab不变
总结:不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。
函数调用可以而且只可以得到一个返回值,而使用指针变量作参数,可以得到多个变化了的值。
三:指针数组
数组名代表数组中的首元素的地址。
int a[10];
int *p = &a[0];//等价: int *p = a;
//*(p+2) *(p+2) a[2] 三者等价
注意:++ 与*同优先级,结合方向自由而左
当用数组名作参数时,如果形参数组中各元素的值发生改变,实参的值也会改变。
实参数组名代表该数组首元素的地址,而形参是用来接收从实参传递过来的数组首元素地址的。
int i,arr[10],*p=arr;//指针变量p指向arr[0]
int i ,*arr://指针变量arr未指向数组元素
如果用指针变量作为实参,必须先试指针变量有确定的值,指向一个已经定义的对象。
四:通过指针引用多维数组
a[3][5];
数组名a表示二维数组首行的首地址。
a+1表示序号为1的行的首地址。
a[0]的地址&a[0][0] ,a[1]的地址&a[1][0],a[1][1]的地址 a[1]+1。
c 指针(一)的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- c 数组与指针的使用注意事项
数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
随机推荐
- TCP 协议中MSS的理解
在介绍MSS之前我们必须要理解下面的几个重要的概念.MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segment Size 最大分段大小PPPoE ...
- Four Operations---hdu5938(暴力)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5938 题意:给一个不超过20位并且大于2位的数字字符串(只包含1-9)然后找到适当的位置依次放入&qu ...
- 【指标测试】影响IOPS的几个重要因素
1. 读写方式 顺序读写的IOPS要比随机读写的IOPS高.100%顺序读写来讲,顺序读要高于顺序写.100%随机读写来讲,随机读要高于随机写.小块读写的IOPS要比大块读写高.需要根据实际的应用程序 ...
- iOS Node Conflict svn冲突
当出现这个冲突时,应该是我add的文件,和同事处理的方法有冲突导致的. 这个的解决办法是:先revert这个文件,然后再update.
- web前端学习网址
最近一次电脑崩溃,重装系统所有在浏览器的网址,烟霄云散了…… 手册网址: http://www.shouce.ren/api/index demo学习网址: http://www.w3cplus.co ...
- Ubuntu 安装软件
1,安装pthread的man文档 sudo apt-get install manpages-posix manpages-posix-dev
- sqlite数据库 adb 从配置到查询表中数据全过程-----献给初学的自己
1. E:\Android\android-sdk-windows\platform-tools[将adb.exe文件的路径放到path中,设置环境变量] 2. adb -s emulator ...
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- Android APP开发笔记
环境搭建 windows系统上需要以下软件: android SDK -- app开发工具包, 开发运行环境(包括SDK管理工具,和虚拟设备管理). JDK -- java 开发工具包, 负责app代 ...
- python password输入
1.linux下用getpass,没有星号提示,符合linux风格 from getpass import getpasspwd = getpass('Enter the password: ') 2 ...