指针变量

c语言基础2指针

冷暖自知 提交于 2020-02-11 06:07:42
--------- 指针的详解 --------- 指针的定是 int * a; b = 1; a=&b 可以看出来,a这个指针变量存的是b的地址。 可以变形为int *a=&b *d 表示访问位置100,并取得里面的值。 一个常见的错误,int *a ;*a= 12;但是a究竟指向哪里呢,由于我们没有对a进行初始化,所以我们没有办法预测12这个值究竟存在哪里。如果变量是静态的 它会被初始化为0,如果是自动的它根本不会被初始化,无论哪种情况,声明一个 指向整型的指针都不会创建用于存储整型的内存空间。 所以程序执行这个赋值操作,将会发生什么呢?如果你运气好,a的赋值是个非法地址,这样赋值语句将会出错 标准定义了空指针,NULL指针,它作为一种变量特殊的指针变量,表示不指向任何东西,要使一个指针变量变为NULL,你可以给他附一个零值。为了测试一个指针是否为空 可以将他与零值进行比较,之所以选择零值是因为一种源代码约定,就机器语言而言,NULL指针的实际值可能与此不同,在这种情况下,编译器负责将零值和 内部值之间进行转换。 NULL指针的概念非常有用,因为他给了你一种方法,表示某个特定的指针目前并未指向任何东西。例如一个用于在某个数组中查找某个特定值的函数可能返回一个 指向查找到得数组元素的指针。如果该数组不包含指定条件的值,函数就返回一个NULL指针

C和指针小结(C/C++程序设计)

烂漫一生 提交于 2020-02-11 06:07:24
C和指针 相关基础知识:内存的分配(谭浩强版) 1、整型变量的地址与浮点型/字符型变量的地址区别?(整型变量/浮点型变量的区别是什么) 2、int *p,指向整型数据的指针变量。 3、通过指针变量访问整型变量。 4、*p :指针变量p指向的存储单元(变量) 5、p = &a——>> *p = *&a 6、用指针作函数参数 7、 调用函数中,由于虚实结合是采用单向的“值传递”方式,只能从实参向形参传数据,形参值的改变无法回传给实参。 8、引用一个数组元素可以用(1)下标法(2)指针法(占内存小,运行速度快) 9、指针提高效率在那些方面?(内存,运行时间??) 10、如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。 11、用指针变量作函数形参接受数组地址。 数组指针和指针数组的区别 1 #include"iostream" 2 using namespace std; 3 int main() 4 { 5 void sort(int *p,int n); 6 int a[5],i; 7 cout<<"input array:"<<endl; 8 for(i=0;i<5;i++) 9 cin>>a[i]; 10 cout<<endl; 11 sort(a,5); 12 cout<<" the sorted array:"<<endl; 13 for(i=0;i

C语言------指针

好久不见. 提交于 2020-02-11 05:28:46
1. 每个字节包含8个位,为了存储更大的值,我们把两个或更多个字节合在一起作为一个更大的内存单位。每个字一般由2个或4个字节组成。需要注意的是,尽管一个字包含了4(或2)个字节,它仍然只有一       个地址。 2. 指针的初始化是用&操作符来完成的,它用于产生操作数的内存地址。 3. 一个变量的值就是分配给这个变量的内存位置所存储的数值,即便是指针变量也不例外。 4. 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing the pointer)这个用于执行间接访问的操作符是单目操作符 “*”。 5. 对指针进行解引用操作可以获得它所指向的值。从定义上看,NULL指针并未指向任何东西。因此,对一个NULL指针进行解引用操作是非法的,在对指针进行解引用操作前,你首先必须确保它非NULL指针 6. 对所有的指针变量进行显式的初始化是种好做法,如果你已经知道指针将被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL,风格良好的程序会在指针解引用之前对它进行检查,这种初始化策略可以节省大量调试时间。 7. 变量(除了const变量外)都是左值。指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。 8. 指向指针的指针。例如:*b = &a; c = &b; 那么**c就是指向指针的指针。  

指针续

天涯浪子 提交于 2020-02-11 05:21:35
什么是指针 指针是一种数据类型(代表内存地址的整数),使用它定义的变量叫指针变量 为什么使用指针、什么情况下使用指针 1、函数之间无法通过传参共享变量。函数的形参变量属于被调用于者,实参属于调用者,函数之间的名字空间相互独立是可以重名的,函数之间的数据传递都是值传递(赋值、内存拷贝)。 2、使用指针可以优化函数之间传参的效率。 3、堆内存无法与标识符建立联系,只能配合指针使用。 如何使用指针 定义:类型 * 变量名p; 1、指针变量与普通变量使用方法有很大区别,一般以p结尾,与普通变量区分开。 2、* 表示此变量是指针变量,一个* 只能定义出一个指针变量,不能连续定义。 int* p1,p2,p3; (p1是指针,p2,p3是int变量) int *p1,*p2,*p3; (三个指针变量) 3、类型表示的是存储是什么类型变量的地址,它决定当通过地址访问这块内存时访问的字节数。 4、指针变量的默认值也是不确定,一般初始化为NULL(空指针)。 赋值:指针变量 = 地址 1、栈地址赋值: int num = 0; int * p = NULL; p = & num; 2、堆地址赋值: int * p = NULL; p = malloc(4); 解引用(根据地址访问内存):*指针变量名 <=> 变量 1、根据变量中存储的内存编号去访问内存中的数据,访问多少个字节要根据指针变量的类型。

C语言——什么是指针?

谁都会走 提交于 2020-02-11 05:21:22
去年学C语言课时,初步了解了指针的概念,能看懂一些简单的含有指针的程序,但事实上对于指针并没有真正的弄明白它的使用,这点我在半年后的数据结构课程上才深刻的体会到和别人的差距。更加可怕的是,对于当时所得的一知半解,现在已经忘的八九不离十了,所以决定进行C语言核心部分的重修,巩固自己的基础。 1.什么是指针? 定义一个变量,系统会为它分配内存单元,内存区的每一个字节有一个编号,即“地址”。 我们可以通过地址找到所需的变量单元,即:地址指向该变量单元。而这个地址便被形象化的称为“指针”。即: 一个变量的地址称为该变量的指针。 2.什么是指针变量? 定义一个变量,专门用它来存放另一个变量的地址,这个变量被称为指针变量。指针变量的值是地址(指针)。 3.指针变量的定义。 int *p;//类型名 * 指针变量名; ***注意:指针变量p前面的 *,指针运算符,表示的是“指向” ,表示该变量的类型为指针型变量。在定义指针变量时必须指定基类型。 int a,b; int *p1,*p2;//定义两个指向int的指针变量p1,p2 p1=&a;//a的地址赋给指针变量p1 p2=&b;//b的地址赋给指针变量p2 ***注意: &,取地址运算符,&a是变量a的地址 。 4.指针变量的引用。 *p1=100;//将100赋给p指向的变量,即变量a=100 printf("%d",*p1);/

c的详细学习(10)结构体与共用体的学习(二)

橙三吉。 提交于 2020-02-11 04:47:24
在c语言中,结构体数据类型与共用体数据类型都属于构造类型。共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别。结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而共用体变量的所有成员占用相同的存储空间,在某一时刻只有一个成员起作用。 (1)共用体类型的定义 定义共用体类型的一般形式: union 共用体类型名 { 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名3; ...... }; 以上定义了一个名为data的共用体类型。它说明该类型由三个不同类型的成员组成,这些成员共享同一块存储空间。 (2)共用体变量的定义 与结构体变量的定义类似; (3)共用体变量的引用和初始化 1.引用共用体变量中的一个成员 引用共用体变量的成员的一般形式 共用体变量名.成员名 共用体指针变量->成员名 第一种引用方式应用于普通共用体变量,第二种引用方式应用于共用体指针变量。 union data a,*p=&a; 2.共用体类型变量的整体引用 可以将一个共用体变量作为一个整体赋给另一个同类型的共用体变量。例如: union data a,b; ...... a=b; 3.共用体变量的初始化 在共用体变量定义的同时只能用第一个成员的类型值进行初始化,共用体变量初始化的一般形式: union 共用体类型名 共用体变量={第一个成员的类型名}; 例如:

指针的用法

我的未来我决定 提交于 2020-02-11 04:40:49
大家都应该知道, 指针是个什么玩意儿, 它就是用来存另一个变量的地址的。这玩意儿在程序中容易引起不易察觉的错误, 而且会给调试带来莫大的困难。 尽管如此,它现在依然存在着, 这就从另一方面说明了, 它的功能爆表。 在实现链式存储, 图, 树, 森林时, 大都要用指针。 不仅如此, 在访问多维数组,函数参数传递时, 也多用指针。下面给出指针的一些常用的用法代码。      /*指针的声明及一般用法*/ /*________________________________________________________________*/ //声明: int a; int *p=&a; int a; int *p; p=&a; #include<stdio.h> int main() { int a, b; int *ipointer1, *ipointer2; scanf("%d%d", &a, &b); ipointer1 = &a; ipointer2 = &b; printf("The number is:%d %d\n", *ipointer1, *pointer2); } #include<stdio.h> int main() { int *p, q; p=&q; scanf("%d", p);//另类写法。 printf("%d\n", q); return 0; }

IOS笔记-C语言中的指针与数组

蹲街弑〆低调 提交于 2020-02-11 03:53:29
1、指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型 *指针变量名; 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = &a[0]; // &a[0] == a int *p1 = a; ii.用数组的指针访问数组元素 偏移:指针变量的偏移 p1 = p1+1; //向下偏移1个一个数组元素 p1++; //p1中存放的还是地址 .... 如果用指针访问第i个元素 p1+i 取出pi指向的元素的值:*(p1+i); == a[i]元素的值 具体地址值计算:p1+sizeof(数组的类型) 指针数组(数组中的每个元素都是指针) 数组中的每一个元素还是一个指针 int a[3][3]={11,2,3,4,5,6,7,8,9}; a[0] //行地址 a[1] a[2] //pa就是一个指针数组 int *pa[3]={a[0],a[1],a[2]}; 2)指针与二维数组 数组指针(指向数组元素的指针) 特定的格式: int (*p3)[3]; //定义一个指向二维数组的指针,而且二维数组的第二维长度要是3 int b[3][3]; p3 = b; int b1[2][3]; p3 = b1; int b2[2][2]; p3 = b2; //编译器给警告 用指针对二维数组的遍历 int a[3][3] ={1

c++ 面试整理

别说谁变了你拦得住时间么 提交于 2020-02-11 02:58:10
1. 继承方式 public   父类的访问级别不变 protected 父类的public成员在派生类编程protected,其余的不变 private 父类的所有成员变成private #include <iostream> using namespace std; class base { public: void printa() { cout <<"base"<< endl; } protected: void printhello() { cout <<"helo"<< endl; } private: void printnohello() { cout <<"no hello"<< endl; } }; class derived : public base { public: void printb() { printhello(); } // void printc() { printnohello(); } //printnohello是父类的私有函数,不可访问 }; int main() { base a; a.printa(); //a.printhello(); //printhello是类derived的protected函数,不可访问。 } 2. sizeof 和 strlen 的区别 sizeof 是一个操作符,strlen 是库函数。

C语言:指针的几种形式

╄→尐↘猪︶ㄣ 提交于 2020-02-11 02:57:58
字符串的两种形式: 1、字符数组 char name[32] = “zhangsan”; //只能在初始化时这样做 strcpy(name,”lisi”); //整体赋值只能通过strcpy name = “lisi”; //error,将一个常量字符串的地址(“lisi")赋值给常量指针(char* const name) 2、字符指针 char *name = “zhangsan”; //指针变量name指向了常量字符串的开始地址 char* name; //在使用野指针(未初始化的指针) scanf(“%s”,name); //error, strcpy(name,”lisi”); //error,如果name指向了常量的字符串,会崩掉。 如果name没有初始化,程序有可能会崩掉,也有可能会覆盖内存中的数据。 name = “lisi”; //ok,重新修改指针变量name的指向,即指向一个新的字符串地址。 1、const int* p和int const* p:两者意义是相同的。指向的内容是只读数据,不可以q改变;但是指向的地址可以改变。 2、int* const p:必须先对指针初始化,而且指向的地址是只读的,不可以再被改变;但是指向的内容可以改变。 3、const int* const p:既不可以改变指针指向的地址,也不可以改变指针指向的内容。 来源: https:/