指针

指针数组   参考1   参考2  参考3  参考4

1.指针 也是一种变量。指针内部存的是一块内存的地址。

//指针: 通常我们说的指针其实是指针变量,相比于其他基本数据类型的变量不同,它存储的是数据对应的内存地址

int *p = NULL;

/*

int * :指针变量的类型,指针变量类型规定存储空间的大小只和我们操作系统有关,对于32位的操作系统 4个字节,64 位操作系统 8个字节

如:float * , char * ,long *

int * 中:

int 的作用就是通过指针变量存储数据时,决定一次性读几个字节数据

指针的指向一定是我们可控的区域

* 表示后边定义的变量是个指针变量,用来存储地址

p 指针变量的变量名

NULL 代表是指向一块无效地址的内存地址,恒为0

*/

int a = 3;

p = &a;//指针变量p 指向整型变量 a

// 如何访问 a 的内容

//1.直接访问 直接取变量的名字 a

a = 10;

//间接访问  通过指针变量访问

// * 的作用 是一个取值运算符,根据指针变量P存储的地址去找到对应的内存空间

*p = 20;// *p 在等号的左边的话,意味着给这块内存空间赋值 ;如果 *p 在等号的右边 就是取值操作

//定义一个整型变量 赋值为30 定义一个指针 存放他的地址 通过指针变量来完成 取值和赋值操作

int b = 30;

int *q = &b;

*q = 500;

int i = *q ;

//区别开这两种变量的空间大小

//指针变量的空间 p

//指针变量指向的空间 *p

注意:

int bb = 300;

char *u = NULL;//把这里的char 改为 int 就不会出现 后面打印出随机值的情况了

u = &bb;

printf("%d\t\n",*u);

int bb = 300;

char *u = NULL;//把这里的char 改为 int 就不会出现 后面打印出44的情况了

u = &bb;

printf("%d\t\n",*u);

//不是同一类型的变量在初始化的时候,有可能地址分配的不是连续的,比如int float double  char ,但是同类型的数据开辟内存的时候是联连续的

int aa = 10;int cc = 20;int dd = 30;

int *p = &cc;

p++;//注意内存分配是从高到底,存取值是从低到高(**重要)

printf("%d\t\n",*p);

自动变量:参考

指针和数组的区别:

1.指针能够重定向

2.空间大小,指针变量的空间大小只与操作系统有关系 32位对应的是4个字节 64位 对应的是8个字节 。数组的空间大小,数组元素的个数 * 单个元素所占的空间大小 
       3.指针可以重指向,数组名不可以重指向,数组名代表数组的首地址,常量地址,之不可以改变,而指针是一个变量,可以重新赋值。

// scanf("%[^\n]",a);只有在scanf()里面输入多个单词里面有多个空格的话,要用到这个格式化去处理多余的空格

区别定义

指针数组:用来存放的指针的数组,就是数组元素都是指针

数组指针:指向数组的指针

数组指针 :是指针,指向数组数组的指针

指针数组 :是数组,存放指针指针的数组

用法
(1)指针数组:  int * a[4]  表示 a[4] 数组里面存放的都是 int 类型指针。  元素表示   * a[i]   与  * (a[i]) 是一样的,因为 [] 的优先级高于 *

(2)数组指针:  int (*a)[4] 表示 指向数组 a 的指针 表示 (*a)[i]

注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧

定义结构体指针实战

// 定义一个结构体 里面有四个成员变量
struct student{
char name[]; //姓名
float score; //分数
int age; //年龄
char gender; //性别
};
typedef struct student Student; void outputSingleInfo(Student *u);
int main(int argc, const char * argv[]) { Student stu1 = {"Ann",'f',,};
//访问结构体成员
// stu1.name;
//结构体指针变量,指向 stu1
Student *p = &stu1;
// p -> name;//p里面存放的是 stu1 的地址,指向操作符 就是去访问里面的每个变量(用结构体指针变量访问成员)
// -> 就是指向操作符 //输出一个结构体变量的成员信息
outputSingleInfo(p); //定义一个有五个元素的结构体数组
Student students[]={
{"zhao",'m',,},
{"zhang",'f',,},
{"yang",'m',,},
{"wang",'m',,},
{"fan",'f',,}
};
return ;
}
void outputSingleInfo(Student *u){
printf("%s,%c,%d,%f",u->name,u->gender,u->age,u->score);
}
// 定义一个结构体 里面有四个成员变量
struct student{
char name[]; //姓名
char gender; //性别
float score; //分数
int age; //年龄
};
typedef struct student Student;
//访问结构体成员
//stu1.name; //结构体指针变量,指向 stu1
Student *p = &stu1;
//p里面存放的是 stu1 的地址,指向操作符 " -> " 就是去访问地址所指向空间里面的某个变量(用结构体指针变量访问成员 name 如: p -> name; )
// -> 就是指向操作符

C:指针的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. C++智能指针

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

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

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

  9. 智能指针shared_ptr的用法

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

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. (四)Logistic Regression

    1 线性回归 回归就是对已知公式的未知参数进行估计.线性回归就是对于多维空间中的样本点,用特征的线性组合去拟合空间中点的分布和轨迹,比如已知公式是y=a∗x+b,未知参数是a和b,利用多真实的(x,y ...

  2. [转载] ubuntu开机直接进入命令行模式

    最近安装了ubuntu12.04来使用,每次都进入unity界面再进入命令行很不方便. 不需要界面的话,可以通过设置来开机进入命令行模式. 今天提供两中比较好的方法.经本人测试两中方法都可使用. [1 ...

  3. Android堆栈分析

    在开发中,与界面跳转联系比较紧密的概念是Task(任务)和Back Stack(回退栈).activity的启动模式会影响Task和Back Stack的状态, 进而影响用户体验.除了启动模式之外,I ...

  4. zabbix (2.0.6) 历史记录处乱码

    1.首先备份数据库 mysqldump -uroot -p123456 zabbix > zabbix.sql 2.设置字符 sed -i 's/latin1/utf8/g' zabbix.sq ...

  5. 嵌入式 使用udev高效、动态地管理Linux 设备文件

    本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...

  6. C# 使用NPlot绘图

    首先要将下载的NPlot.dll加到工具箱里,拖一个控件到窗体上,声明using NPlot. 一.入门 1. 对所绘的图进行打印与保存 private void print() { myPlot.P ...

  7. android学习——MeasureSpec介绍及使用

    一.MeasureSpc类说明 SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求.每个MeasureSpc实例代表宽度或者高度 它有三种模式:①.UNSP ...

  8. C++读取二进制文件(某特定格式)

    该格式也不复杂,就是一个二进制文件,格式为:8个通道,每个通道2字节,都为整数,最后两个通道都是0x03FF == 1023d,文件中中若干个8通道. 有个小细节就是:下面代码中 infile.rea ...

  9. no symbol version for module_layout

    内核模块编译helloworld: no symbol version for module_layout, 尝试各种解决办法, 都没搞定, 版本也是对的. dmesg提示no symbol vers ...

  10. 关系数据库&&NoSQL数据库

    在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发.因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库. ...