C++指针

1、指针就是直接操纵内存,是一种数据类型,也占内存空间
内存是容器 能够操纵内存就意味着能操作程序
程序运行起来放到容器里,由cpu控制
内存是分成一个个方格,将东西存进去,首地址+共占用几个格子来提取它=内存地址+数据类型
比如int类型占了4个格子
每个格子的长度是一个bit
指针类型—首地址+长度 比如:int* char* void*只有首地址,只能用来交换地址(是内存级别的操作) 数据/类型级别的操作就是需要转换,int转换成double等等

2、用处:
1)函数传参(使用指针) int(4Byte) int*(4Byte) 但是MyClass(250Byte) 指针只有MyClass*(4Byte)【如果是32位系统的话】
2)跨函数的值修改(函数参数的传递都在栈里面)就是利用temp交换两个值的时候使用
3)数据结构—做链表的时候需要指针,数组就是const int * 类型的指针
4)2级指针就是指向指针的指针

3、点c是以c的编译器编译的,cpp是c++

4、
fck=1;
int * pt=&fck —> *pt=1 pt=&fck
5、指向int的指针长度和指向double的相同,sizeof 都是4

指针,C语言指针完全攻略


1、指针通过控制地址,进而控制计算机底层硬件
2、一个地址对应一个内存单元,内存单元上放数据。地址=指针
字符=1个字节=8比特=8位二进制表示
3、
在使用已定义好的指针变量时,在变量名前面不能加 *。例如:
int *p,a;
*p=&a; //错误,指针变量是p而不是*p
应该是p=&a  等价于 int *p=&a (实际是 把&a赋给了p)
 变量名是一合法标识符,为与普通变量相区分,一般指针变量名以字母 p(pointer)开头,如 pa、pb 等。
4、
死亡重叠,关键是看*p=这个变量是指针变量还是普通的变量。
例如:
int *p,a=3;//p中保存变量a对应内存单元的地址
p=&a;
在该地址 p 前面加上间接访问符 *,即代表该地址对应的内存单元。而变量 a 也对应该内存单元,故 *p 就相当于 a。

printf("a=%d\n",a); //通过名字,直接访问变量a空间(读取)
printf("a=%d\n",*p); //通过地址,间接访问变量a空间(读取)
*p=6;//等价于a=6;间接访问a对应空间(存)

5、i 行首元素地址:a[i] + 0 <--> *(a + i) +0 <-->&a[i][0]
理解二维数组的关键在于a[i]是元素值,但是在二维数组中,这个a[i]存的内容就是列信息的地址
6、
关键在于指针是指向数组还是数组里面的element是指针元素即为存的都是地址比如a[0]=&a0;因为你的*已经出现在声明中了,对应上面的“死亡重叠”
int (*p)[5];
上述语句表示定义了一个指向一维数组的指针 p,或者简称为一维数组指针 p,该指针 p 只能指向含 5 个元素的整型数组。
int *p[5];
由于下标运算符 []* 运算符的优先级髙,p 首先与下标运算符 [] 相结合,说明 p 为数组,该数组中有 5 个元素,每个为 int * 型。即 p 为指针数组。

7printf ("%c",*("abcd"+2) ) ;//输出字符'c'
char c[]="xyz";
数组名 c 为指针常量,即字符的地址,故 c+1 为字符 'y' 的地址,故如下语句输出 yz

8、指针作函教返回类型——指针函教。在字符串处理函数中尤为常见
函数指针---函数同其他变量一样,占一块连续内存空间,把该空间的起始地址成为函数指针。函数指针通常主要用于作为函数参数的情形
int add (int a, int b); //加操作
int sub (int a, int b) ; //减操作
int mult (int a, int b) ; //乘操作
int div (int a, int b); //除操作
//计算器函数
void cal (int (*pf) (int, int) , int op1, int op2)
{
    pf (op1,op2) ;//或者(*pf) (op1,op2);
}
1、manly表示一个地址---打印出来是16进制的值  =&other
*manly表示存储在该地址处的值    =other(改其中一个,两个都变)
int *manly=&other   等价于  manly=&other    manly 不等于 &manly
2、long *fellow; //指针没有初始化,禁止这样使用,因为会出隐匿bug
     *fellow = 223323;
3、new 缺delete内存泄漏(memory leak)
4、double * p3 =new double [3];
    *p3=p3[0]
    如果p3+1那么p3[0]就等于原来的p3[1]
    delete的时候地址p3必须 = p3-1,这时才能为delete[]提供正确的地址否则报错
5、short stacks[3] = {3,2,1};
short * ps =&stacks[0]或者stacks
当ps = ps+1后,*ps=2,但是stacks[0]还是等于3
6、sizeof(指针地址8位(无论什么类型的地址),double 8字节(64比特)  double[3] 24字节)

7、strcpy(预备好装的空车,要复制的字符串地址);
ps=animal      ps=animal的地址   *ps=*animal
strcpy(ps,animal)  ps不等于animal  *ps = *animal  通过使用strcpy和new,将获得两个独立的副本
当animal的字符数大于ps时,会出问题。所以使用strncpy(ps,animal,4);ps[4]='\0'
8、如果指针类型是char * ,那么cout<< ps是它指向字符串比如fox,要显示地址,需要强转为另一种类型
比如(int *)ps =地址
9、关于->(跟指针地址配套)
struct things
{
  int good;
  int bad;
};
things grubnose = {3, 453};
things * pt = &grubnose;
grubnose.good = pt ->good = (*pt).good

10、死亡误区
*ppa=arp,      说明ppa=&arp=arp, *ppa=*arp,不是*ppa的值等于arp

11(*pt)++ =的还是*pt的值,然后再打印*pt就是原来的值+1
*pt++  打印的值还是*pt的值,然后再打印就是数组下一个的值

++再后面总是下一步显示其威力,后面的++优先级> 前++和*(也就是解引用)

12、函数名就是函数的地址
(*pf)(int) 意味着pf是一个指向函数的指针。 
比如 声明void estimate(double (*pf)(int));   调用就是estimate(function_name);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值