django 做网站,竞价推广托管,网站后台上传不了图片,html代码表格/*
//学习内容
数组及其使用方法
如何声明和初始化不同类型的数组
如何声明和使用多维数组
指针及其使用方法
如果声明和初始化不同类型的指针
数组和指针之间的关系
引用的概念及声明方法#xff0c;关于使用引用的几点初步建议
如何在本地C程序中给变量动态分配内存
如何在C… /*
//学习内容
数组及其使用方法
如何声明和初始化不同类型的数组
如何声明和使用多维数组
指针及其使用方法
如果声明和初始化不同类型的指针
数组和指针之间的关系
引用的概念及声明方法关于使用引用的几点初步建议
如何在本地C程序中给变量动态分配内存
如何在CLR程序中动态分配内存
跟踪句柄和跟踪引用的概念CLR程序中需要它们的原因
如何在C/CLI程序中处理字符串和数组
内部指针的概念创建和使用内部针的方法4.1 处理多个相同类型的数据值4.1.2 声明数组#include stdafx.h
#include iostream
#include iomanip
using namespace std;
int main()
{const int MAX 20;double gas[MAX];long miles[MAX];int count 0;char ch y;while((chY || chy) count MAX){cout气油的价格:;cingas[count];coutendl;cout请输入miles数值:;cinmiles[count];count;cout是否继续执行(y/n)endl;cinch;}if(count 1){cout对不起没有有效数据endl;return 0;}for(int i1; icount; i){coutsetw(2)i . ;cout Gas purchased gas[i] gallons ;cout((miles[i]-miles[i-1])/gas[i]) miles per gallon.;coutendl;}system(pause);return 0;
}*///4.3.1 初始化数组/*#include stdafx.h#include iostream#include iomanipusing namespace std;int main(){int value1[5]{1,2,3};int value2[5];for(int i0; i5; i){coutsetw(2)value1[i] ;}coutendl;for(int i0; i5; i){coutsetw(2)value2[i] ;}coutendl;system(pause);return 0;}//4.1.4 字符数组和字符串处理//注意:字符串中每个字符占用一个字节因此算上最后的空字符字符串需要的字节数要比包含的字符数多一个//wchar_t president[] LUlysses Grant;前缀L表示字符串字面值是一个宽字符串因此字符串的每个字符(包括终止空字符)都会占两个字节当然对字符串的索引会引用字符而不是字节 1 字符串输入const int MAX 80;char name[MAX];cin.getline(name,MAX,\n);name: char[]类型数组的名称从cin读取的字符存储在该数组中MAX: 要读取的字符的最大数量当读取了最大数量的字符数后停止输入\0: 结束输入过程的字符在此可以指定任一字符且该字符在首次出现时就将结束输入过程
*/
/*#include stdafx.h
#include iostream
using namespace std;
int main()
{const int AMX 80;char buffer[AMX];int count0;cout请输入一串字符:endl;cin.getline(buffer,AMX,\n);while(buffer[count] !\0){count ;}cout输入的字符串为:buffer 长度为:countendl;system(pause);return 0;
}*///4.1.5 多维数组//1初始化多维数组
/*#include stdafx.h
#include iostream
#include iomanip
using namespace std;
int main()
{//int ch[3][4]{0};//char ch[3][4] {s}; //这里默认声明字符串数组好像不行char ch[3][4] {s,v,v,t,s,v,t,e,s,v,t,e}; //注意数组中有多少维初值组就需要多少层嵌套的大括号这句话么意思哦不懂啊 是等号右边吗不行哦for(int i0; i3; i){coutsetw(2)i;for(int j0; j4; j){coutsetw(2)ch[i][j] ;}coutendl;}system(pause);return 0;
}#include stdafx.h
#include iostream
#include iomanip
using namespace std;
int main()
{char ch[][80] {Robert RedFord,Gioakibg Cassudt,Lassie,Slim Pickens,Boris Karloff,Oliver Hardy}; //注意数组中有多少维初值组就需要多少层嵌套的大括号这句话么意思哦不懂啊 是等号右边吗不行哦int i;cout请输入1 to 6 数字:;cini;if(i1 i6){coutch[i]:ch[i-1]endl;}else{cout输入的值不合法endl;}system(pause);return 0;
}*///4.2 间接数据存取//4.2.1 指针的概念//4.2.2 声明指针//long * pnumber;//long *pnumber;//long* pnumber, number 99;//操这里蛋疼了pnumber是long型的指针而number只是一个long型的变量//在C中使用以字母p开始的变量名表示指针的通用惯例这使我们能更容易看清程序中哪里些变量是指针从而使程序更易于理解//取地址运算符//我们需要的是取地运算符符,该运算符是一元运虎符用于获得变量的地址又名引用运算符。//pnumber number;//4.2.3 使用指针//1 间接运算符//2 需要使用指针的原因
/*#include stdafx.h
#include iostream
using namespace std;
int main()
{long* pnumber NULL;long number1 55, number299;pnumber number1;*pnumber 11; //66coutnumber1:number1endl;coutnumber1hexpnumberendl;pnumber number2; //99number1 *pnumber * 10; //990//number1990coutnumber1decnumber1endl; //990coutpnumberhexpnumberendl;; //99cout*pnumberdec*pnumberendl;; //99system(pause);return 0;
}*///*pnumber 11;//间接运算符使我们将pnumber所指变量--number1的内容加上班11如果忘记在这条语句中写上*号则计算机将使该指针存储的地址加上11//那不就是内存地址的加11//4.2.4 初始化指针//int* pnumber NULL;//if(pnumber NULL) coutpnumber is null.;//int* pnumber 0;//if(pnumber NULL) coutpnumber is 0.;//if(!pnumber){ coutpnumber is null.}//NULL指针指向的地址包含无用数据我们永远不应该解除对某个空指针的引用因为那样将使程序立即终止//1 指向char类型的指针//char * proverb A miss is as good as a mile;//看起来类似初始化char数组但二者细微的区别这条语句用引号之间的字符串创建某个以/0终止的字符串字面值(实际上是const char类型的数组),并将该字面值的地址存储在指针proverb中该字面值的地址将是其第一个字符的地址/*#include stdafx.h
#include iostream
using namespace std;
int main()
{char* pstr1 Robert Redford;char* pstr2 Hopalong Cassidy;char* pstr3 Lassie;char* pstr4 Slim Pickens;char* pstr5 Boris Karloff;char* pstr6 Oliver Hardy;char* pstr Your lucky star is ;int dice 0;coutPick a lucky star 1 and 6:;cindice;switch(dice){case 1: coutpstrpstr1endl;break;case 2: coutpstrpstr2endl;break;case 3: coutpstrpstr3endl;break;case 4: coutpstrpstr4endl;break;case 5: coutpstrpstr5endl;break;case 6: coutpstrpstr6endl;break;default:coutsorry 输入的值不正确endl;break;}//输出指针指向的字符串简单得不能再简单了//显示出来的是该指针包含的地址为里却不同呢//在于输出操作看待char*类型指针的方式输出操作以一种特殊的方式来看待这种类型的指针即将其视为字符串(即char数组)//因些输出字符串本身而不是字符串的地址system(pause); return 0;
}*//*
#include stdafx.h
#include iostream
using namespace std;
int main()
{char* pstr[] { Robert Redford,Hopalong Cassidy,Lassie,Slim Pickens,Boris Karloff,Oliver Hardy,};char* pFirstStr Your lucky star is ;int dice 0;coutPick a lucky star 1 and 6:;cindice;if(dice 1 dice 6){coutpFirstStrpstr[dice-1]endl;}else{coutsorry 输入的值不正确endl;}//输出指针指向的字符串简单得不能再简单了//显示出来的是该指针包含的地址为里却不同呢//在于输出操作看待char*类型指针的方式输出操作以一种特殊的方式来看待这种类型的指针即将其视为字符串(即char数组)//因些输出字符串本身而不是字符串的地址system(pause); return 0;
}*///4.2.5 sizeof运算符//cout(sizeof pstr)/(sizeof pstr[0])//记住pstr是一个指针数组对该数组或元素使用sizeof运算会不能获得任何文本字符中内存占用情况
/*#include stdafx.h
#include iostream
using namespace std;
int main()
{char* pstr[] { Robert Redford,Hopalong Cassidy,Lassie,Slim Pickens,Boris Karloff,Oliver Hardy,};char* pFirstStr Your lucky star is ;int count (sizeof pstr) / (sizeof pstr[0]);coutcount:countendl;//这里计算一共有多省个字符串int dice 0;coutPick a lucky star 1 and count:;cindice;if(dice 1 dice 6){coutpFirstStrpstr[dice-1]endl;}else{coutsorry 输入的值不正确endl;}//输出指针指向的字符串简单得不能再简单了//显示出来的是该指针包含的地址为里却不同呢//在于输出操作看待char*类型指针的方式输出操作以一种特殊的方式来看待这种类型的指针即将其视为字符串(即char数组)//因些输出字符串本身而不是字符串的地址system(pause); return 0;
}*///4.2.6 常量指针和指向常量的指针//const int count (sizeof / pstr) / (sizeof pstr[0])
//#include stdafx.h
//#include iostream
//#include iomanip
//#include string
//#include cstring
//using namespace std;
//int main()
//{/*char* pstr[] { Robert Redford,Hopalong Cassidy,Lassie,Slim Pickens,Boris Karloff,Oliver Hardy,};*///char* pFirstStr Your lucky star is ;//修改pstr[0]所指向的字符内容//pstr[0]Xlc;//coutpstr[0]endl;//cout*pstr[0]endl;//*pstr[0] Stan Laurel; //书上说这样不可以编译但我这里却可以//*pstr[0] x; ///*const char* pstr[] { Robert Redford,Hopalong Cassidy,Lassie,Slim Pickens,Boris Karloff,Oliver Hardy,};*///指针数组的元素指向const字符串如果我们现在试图修必这些字符串则次被编译器在编译时标记为错误//*pstr[0] x; 不可以修改//当然我们仍然可以合法地编写下面的语句//pstr[0] pstr[1];//注意这条语句并没有改变指针数组元素指向的对像的值改变的只是pstr[0]中存储的指针的值我们应该禁止这种修改/*const char* const pstr[] { Robert Redford,Hopalong Cassidy,Lassie,Slim Pickens,Boris Karloff,Oliver Hardy,};*///总之我们应该区分下面这三种const,指针及指针指向的对像有关的情形//指向常量对像的指针//const char* pstr[]{};//指向某个对像的常量指针//char* const pstr[]{}//指向常量对像的常量指针//const char* const pstr[]{}//第一种情况我们不能修改被指向的对像但可以使指针指向其它对像//const char* pstring Some text;//const char* pstring Some text;//如果修改指针指向其它对像, 这里需要知道这么回事但还是不太理解其它的对像是指一个I some text吗?//但我用 const char _str[] I some text; 然后赋值给pstring还是不成功//pstringI some text;//coutpstring:pstringendl; // *pstring xxdxxd; 不能修改被指向的对像//第二种情况我们不能修改指针中存储的地址但可以修改指针指向的对像//char* const pstring Some text;//常指针就是创建不能移动的固定指针但是它所指的数据是可以改变的//pstring[0] s;// char * const pc abcd;// cout pcendl;// pc[3]x;// coutpcendl;//网上指的也不起做用//pstring I Some text; //不能修改指针中存储的地址//*pstring I some text;//不知道怎么来描述或者说怎么来写“可以修改指针指向的对像”//在最后一种情况下指针和被指向的对像都被定义成常量因此都不能被修改//const char* const pstringSome Texst;//4.2.7 指针和数组//double* pdata;//double date[5];//则可以进行下面的赋值操作//pdata data;//该语句将数组data中第一个元素的地址赋给指针pdata,单独使用数组名称将引用该数组的地址如果我们使用带索引仁政的数组名data,//则引用的是对应于索引值的那个元素的内容因此如果我们希望将该元素的地址存入指指中则必须使用取址运算符//pdata data[1];//1 指针算术运算//我们可以用指针执行算术操作在算术方面我们仅限于加减操作//pdata data[2];//这种情况下表达式pdata1将是数组data中的第四个元素data[3].因此我们通过下面的这条语句就可以使指针pdata指向元素data[3]//pdata;//注意指针算术运算产生的地址范围可以从数组第一个元素的地址到最后一个元素之后的第一个地址如果超出该范围则指针的行为是不确定的//对于作为指针算术运算结果的指针来说我们当然可以解除对它的引用(否则该指针就没什么用途)//假设pdata仍然指向data[2]//* (pdata1) *(pdata2);//data[3] data[4]//当我们使某个指针包含的地址递增之后又希望解除对该指针的引用时圆括号是必不可少的因为间接运算符的优先级高于算述运算符或-的优先级如果写成*pdata 1 而非*(pdata1),//则使pdata指向的地址中存储的数值加1,即等价于执行data[2]1; 因为该表达式不是一个左值所以用于前面的赋值语句时将使编译器生成一条出错消息/**const int MAX 100;long primes[MAX] {2,3,5};long trial 5;int count 3;int found 0;do{trial 2; //7found 0; //0for(int i0; icount; i){found (trial % *(primesi)) 0;if(found){couttrial:trialendl;cout*(primesi):*(primesi)endl;break;}}if(found 0)*(primes count) trial;}while(count MAX);for(int i0; iMAX; i){if(i % 5 0)coutendl;coutsetw(10)*(primes i);}*///计算字符的个数/*const int MAX 80;char buffer[MAX];char* pbuffer buffer;cout请输入你要的字符串最大值为MAXendl;cin.getline(buffer,MAX,\n);//因为指针pbuffer是在while循环中递增的发现\0字符之后递增将停止当发现\0字符时pbuffer将包含字符串中该字符的地址//因此输入的字符串中字符的个数就是指针pubffer中存储的地址与buffer指示的数组开始地址的差值//这句话很重要pbuffer将包含字符串中该字符地址因此输入的字符串中字符的个数就是指针pbuffer中存储的地址与buffer指示的数组开始的地址的差值while(*pbuffer){pbuffer;}coutthe stirng :bufferendl;cout has (pbuffer - buffer -1) characters. ;coutendl;//注意我们不能用与使用指针相同的方式使用数组名表达式buffer绝对是非法的因为我们不能修改数组名表示的地址尽管我们可以在表达式中像使用指针一样使用数组名但是数组名不是指针因为它表示的地址是固定的*/// 2 使用指针处理多维数组//但相对处理多信数组时事情就变得稍微复杂一些了//double beans[3][4];//我们可以声明一个指针pbeans//double* pbeans;//pbeans beans[0][0]; //我们也可以用下面的语句将指针设置为数组中第一行的地址//pbeans beans[0];//但由于beans是二维数组因此不能用下面的语句设置指针中的地址//pbeans beans;//问题在于类型不同前面定义的指针类型是double*, 但是数组beans的类型是double[3][4],//存储该数组地址的指针必须是double*[4]类型C将数组的大小与类型联系在一起//上面的语句仅当将指针声明为要求的大小时才合法这种声明形式比前面所介绍的都复杂一些//double (*pbeans)[4];//此处的圆括弧是必需的否则声明的将是一个指针数组前面那条语句现在是合法的但是该指针只能用来存储规定大小的数组的地址/*double beans[3][4]{10};double* pbeans beans[0][0];coutpbeans:*pbeansendl;//将第一行做为存储地址double* ppbeans beans[0];*(ppbeans1)22; //这样是个改第一行的第二个值//ppbeans; 这样加不行这样加是指元素向前提一个 //*(ppbeans1)55;//*(*ppbeans1)66;//这里还是不知道如何移动到下一次或者指定下一列的信息coutbeans[0][1]:beans[0][1]endl;coutbeans[0][2]:beans[0][2]endl;coutbeans[1][1]:beans[1][1]endl;*///3: 多维数组的指针形式//使用带两个索引值的数组名//使用指针形式的数组名//beans[i][j];//*(*(beansi)j);//beans是数组变量值而不是指针值//我们来看一下工作过程第一行使用正常的数组索引值引用数组中第i行偏移量为j的元素//我们可以从内向外确定每样二行的意义beans引用数组第一行的地址因此beansi引用提数的第i行//表达式*(beansi)是第i行的第一个元素的地址因此*(beansi)j是i行中偏大移量为j的那个元素的地址因此整个表达式引用的该元素的值/*double beans[3][4]{10};double* pbeans beans[0][0];coutpbeans:*pbeansendl;//我这里个beans[1][1]的元素值*(*(beans1)1) 55; //大爷的这里注意是用beans而不是指针变量pbeans去找的coutbeans[1][1]:beans[1][1]endl;//*(*(beansi)j);//我们不建议这样做那么可以混合使用数组和指针两种形式*(beans[2]1) 66;coutbeasn[2][1]:beans[2][1]endl;(*(beans1))[2] 77;coutbeans[1][2]:beans[1][2]endl;*///4.3动态内存分配//4.3.1 堆的别名--自由存储器//4.3.2 new和delete运算符//double* pvalue NULL;//pvalue new double;//*pvalue 9999.0;//pvalue new double(999.0);//delete pvalue;//这样将确保这块内存以后可被另一个变量使用如果我们不使用delete,随后又在pvalue指针中存入一个不同的地址值那么将无法再释放这块内存或使用其包含的变量因为我们失去了访问该地址的途径这种情况被称为内存泄漏特别是出现在用户程序中的时候//4.3.3 为数组动态分配内存//pstr new char[20]; 声明动态数组//delete []pstr; 删除数组 使用方括号是为了指出要删除的是一个数组//从自由存储器中删除数组时我们应该总是包括方括号否则结果将不可预料别请注意我们不需要指定任何大小只需要写出[]即可//当我们使用delete运算符弃某些内存之后还应该总暗针访俯拾皆是指针重新设置为0//pstr 0;/*long* pprime 0;
long trial 5;
int count 3;
int found 0;
int max 0;cout请输入一个最大值:;
cinmax;if(max 4){max 4;
}
pprime new long[max]; //声明一个long的数组*pprime 2; //第一个值为2
*(pprime1)3; //第二个值为3
*(pprime2)5; //第三个值为5
do
{trial 2;found 0;for(int i0; icount; i){found (trial % *(pprimei)) 0;if(found)break;}if(found0){*(pprime count) trial;}
}while(count max);for(int i0; imax; i)
{if(i % 5 0){coutendl;}coutsetw(10)*(pprimei);
}
delete []pprime;
pprime 0;
//注意我们不能给动态分配的数组元素指定初值如果需要设置数组元素的初值则必须显示使用赋值语句
*///4.3.4 多维数组的动态分配件//与一维数组相比在自由存储器中为多维数组分配内存需要以略微复杂的形式使用new运算符//pbeans new double[3][4];//pBigArray new double[5][10][10];//前面曾经看到可以使用变量来指定new分配的一维数组的大小对二维或多维数组来说同样如此//但仅限于用变量指定最左边那一维所有其他维都必须是常量或常量表达式//pBigArray new double[max][10][10];////不会吧我得试试才知道了/*const int max 20;const int line 30;const int line2 10;double(*pBigArray)[10][10] new double[max][10][10]; //看看成不成功delete [] pBigArray;*///上面说的是正确的书上说的是正确的