杂项 1

对于一些恶心人的调试失败原因
我深感自己菜的很。
真的菜

在堆中开辟一个4×5的二维int数组
//#include <stdio.h>
//#include <malloc.h>
//int** p;
//int i, j;
//void main() {
//    p = (int**)new int*[4];
//    if (NULL == p) return;
//    for (i = 0; i < 4; i++) {
//        p[i] = (int*)new int [5];
//        if (NULL == p[i]) return;
//    }
//   
//    for (i = 0; i < 4; i++) {
//       delete []p[i];
//    }
//    delete[] p;
//}
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
#include<iostream>
using namespace std;
int** p;
int i, j;
int  main() {
    p = (int**)new int* [10];//分配好的内存直接使用就好 
    if (NULL == p) return 0;
    for (i = 0; i < 10; i++) {
        p[i] = (int*)new int[10]; 
        if (NULL == p[i]) return 0;
    }
	int a = 10;
	int w = 100;
	int y = 1000;
	int ww = 1;
	//指针定义后不分配内存 就是个野指针指向某个未知内存 很危险可以指向null 以免不可补救  
	//写入访问权限冲突 为nullptr 此时需要进行内存分配
	/**p = &a;
	p = &*p;*/
	//**p = a;
	//(*p)++;
	//**p = w;
	/**p = &w;
	p = &*p;*/
	//(*p)++;
	//**p = y;
	/**p = &y;
	p = &*p;*/
	/*因为 a[n] 本质上是 *(&a[0] + n) 的语法。
当你使用 &a[4] - &a[3] 时,实际上是:(&a[0] + 4) - (&a[0] + 3)= 1
而不是你想象中的 a第四个元素 的地址减去 第三个元素的地址
int b = &a[0];
int c = &a[1];
printf("%d\n", c-b);
把 a[0] , a[1] 的地址强制另存为整数,然后相减,即可*/
	//** p = a;//指针指向的 地址赋值a的值
	记着二级指针指向堆 p[0]只存放p[0][i]首地址 然后p[0]+0,p[0]+1......
	//堆里面存着一级指针p[i]的集合 一级p[i]可以指向其他指针也可以存放变量的地址
	int* wc,*cw,ccc;
	//wc = &p;//错误不能让int***类型的值赋给wc(int*类型)指针(或者不能存放二级指针地址)

	wc = cw;//指向其他指针
	wc = &ccc;//存放ccc的地址
	//这里注意 数据按边界对齐 起始地址能被自身长度整除 地址*8位/数据类型长度位数。
	cout << "&p:      " << &p << endl;        //1
	cout << "&**p:    " << &**p << endl;      //2 同4
	cout << "&a:      " << &a << endl;        //3
	cout << "&p[0][0]:" << &p[0][0] << endl;  //4
	cout << "&p[0]:   " << &p[0] << endl;     //5  地址+4同7
	cout << "&p[1][0]:" << &p[1][0] << endl;  //6
	cout << "&p[1]:   " << &p[1] << endl;     //7
	cout << "&p[2]:   " << &p[2] << endl;     //10
	cout << "&p[2][0]:" << &p[2][0] << endl;  //11
	cout << "&p[3][0]:" << &p[3][0] << endl;  //12
	cout << "&p[4][0]:" << &p[4][0] << endl;  //12
	cout << "&p[5][0]:" << &p[5][0] << endl;  //12
	cout << "&p[6][0]:" << &p[6][0] << endl;  //12
	cout << "p[1][0]-p[0][0]<<" << (&p[1]+0)- (&p[0]+0) <<" = (&p+1)-(&p+0)"<<(&p+1)-(&p+0)<< endl;
	int ii, jj;
	jj = (int)&p[0][0];
	ii = (int)&p[1][0];
	cout << "ii:    " << ii << "jj     :   " <<jj<< endl;
	cout << "p[1][0]-p[0][0]<<" << ii-jj<< endl;
	cout << "&p:      " << &p << endl;        //8

	p++;//地址就混乱了
	cout << "p++后&p[0][0]:  " << &p[0][0] << endl;//8 变为p[1][0]的地址了
	**p = w;
	cout << "&w              " << &w << endl;//地址+C与y地址同
	p++;
	cout << "p++后&p[0][0]:  " << &p[0][0] << endl;//9 变为p[2][0] 的地址了
	**p = y;
	cout << "&y              " << &y << endl;
	ww++;
	int kk = ww;
	while (kk--)
	{
		p--;
		cout << &p[0][0] << endl;
	}
	cout << p << ":是下面那个数地址的地址" << **p << "前面数的地址:" << *p << endl;
	 kk = ww;
	while (ww--)
	{
		cout << p << ":是下面那个数地址的地址" << **p << "前面数的地址:" << *++p << endl;
	}
	while (kk--)
	{
		p--;
	}
	for (int i = 0; i < 10; i++)
	{
		for (int h = 0; h< 10; h++)
		{
			cout << "&p[" << i << "][" << h << "] :  " << &p[i][j] <<"  ";
		}
		cout << endl;
	}
	//  动态二级指针法 它指向的数组的多少可变,指向内存大小可变,
	//内存可以不连续,但可以以连续的方式访问
	//delete p; //指示调用函数具有不一致的数组运算符分配内存 new [] ,但用标量运算符释放了该函数 delete 。 此缺陷可能会导致泄漏、内存损坏,以及在重写操作员时崩溃的情况下。 如果内存是通过数组分配的 new [] ,则通常应通过数组来释放内存 delete[] 
    for (int i = 0; i < 10; i++) {
		cout << p[i] << "   ";
        delete[]p[i];
    }
    delete[] p;
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值