首页 > 代码库 > 每天一点C++(之四)

每天一点C++(之四)

每天一点C++(之四)<style type="text/css"> /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */ /* Author: Nicolas Hery - http://nicolashery.com */ /* Version: 29d1c5bc36da364ad5aa86946d420b7bbc54a253 */ /* Source: https://github.com/nicolahery/markdownpad-github */ /* RESET =============================================================================*/ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; } /* BODY =============================================================================*/ body { font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 1.6; color: #333; background-color: #fff; padding: 20px; max-width: 960px; margin: 0 auto; } body>*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEADERS =============================================================================*/ h1, h2, h3, h4, h5, h6 { margin: 20px 0 10px; padding: 0; font-weight: bold; -webkit-font-smoothing: antialiased; } h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code { font-size: inherit; } h1 { font-size: 28px; color: #000; } h2 { font-size: 24px; border-bottom: 1px solid #ccc; color: #000; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 14px; } h6 { color: #777; font-size: 14px; } body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child { margin-top: 0; padding-top: 0; } a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 { margin-top: 0; padding-top: 0; } h1+p, h2+p, h3+p, h4+p, h5+p, h6+p { margin-top: 10px; } /* LINKS =============================================================================*/ a { color: #4183C4; text-decoration: none; } a:hover { text-decoration: underline; } /* LISTS =============================================================================*/ ul, ol { padding-left: 30px; } ul li > :first-child, ol li > :first-child, ul li ul:first-of-type, ol li ol:first-of-type, ul li ol:first-of-type, ol li ul:first-of-type { margin-top: 0px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } dl { padding: 0; } dl dt { font-size: 14px; font-weight: bold; font-style: italic; padding: 0; margin: 15px 0 5px; } dl dt:first-child { padding: 0; } dl dt>:first-child { margin-top: 0px; } dl dt>:last-child { margin-bottom: 0px; } dl dd { margin: 0 0 15px; padding: 0 15px; } dl dd>:first-child { margin-top: 0px; } dl dd>:last-child { margin-bottom: 0px; } /* CODE =============================================================================*/ pre, code, tt { font-size: 12px; font-family: Consolas, "Liberation Mono", Courier, monospace; } code, tt { margin: 0 0px; padding: 0px 0px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; } pre>code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } pre { background-color: #f8f8f8; border: 1px solid #ccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px; } pre code, pre tt { background-color: transparent; border: none; } /* QUOTES =============================================================================*/ blockquote { border-left: 4px solid #DDD; padding: 0 15px; color: #777; } blockquote>:first-child { margin-top: 0px; } blockquote>:last-child { margin-bottom: 0px; } /* HORIZONTAL RULES =============================================================================*/ hr { clear: both; margin: 15px 0; height: 0px; overflow: hidden; border: none; background: transparent; border-bottom: 4px solid #ddd; padding: 0; } /* TABLES =============================================================================*/ table th { font-weight: bold; } table th, table td { border: 1px solid #ccc; padding: 6px 13px; } table tr { border-top: 1px solid #ccc; background-color: #fff; } table tr:nth-child(2n) { background-color: #f8f8f8; } /* IMAGES =============================================================================*/ img { max-width: 100% } </style>

每天一点C++(之四)

指针

指针的危险:当我们创建指针的时候,计算机会分配内存来用于储存指针所指的地址值,但是不会分配内存给指针所指向的数据。因此,如果我们出现这样的一种写法的话就会造成不必要的烦恼:

long* fellow;
*fellow = 22;

上面的代码中fellow是一个指针,但是因为fellow并没有分配到地址值,所以它的地址可能是任何值,这样的一种未知性导致了不管fellow的地址值是什么程序都会将它解释为储存22的地址。这样就有可能会破坏程序代码。而且因为不确定,导致的错误十分的隐蔽。

C++中的指针不是整型,但是,如果想要把地址值以整数的形式赋给指针的话,我们通常可以这样来做:

int* pt;
pt = (int* ) 0xB8000000;

用强制转换类型的方式就可以让我们直接对指针的地址进行操作(虽然不知道这样做有什么必要 ~ ~!)

new运算符

当我们想要在程序运行时向系统索要内存以进行其他操作时,我们可以使用new运算符来向系统要。new运算符向系统要回来的是内存的地址,所以我们通常要创建一个指针来存放新内存的地址。然后当我们用完内存后,我们应该要用delete来释放内存(不然会发生内存泄漏哦! 即在程序生命周期中被分配的内存因为没有释放而无法再次使用,当内存泄漏严重的时候,会导致程序因内存爆满而终止),同时不要尝试对已经释放的内存块再次释放内存,这样也会导致错误的发生。但有时候我们也会用到两个指向相同内存的指针,这样就会增加错误删除同一内存块的可能性。(我无语了~ ~)

对于用new来创建动态数组,别忘了加[]在后面哦!!int* pt = new int [100]; delete [] pt;

对于动态数组的使用,我们可以直接以指针名加[]就行了,而指针名+整数如:1;就相当于数组名+1,即指向下一个元素。

指针,数组

C++内部处理数组的方式跟指针十分相像,就像是把指针变量加1,其增加的值等于指向的类型占用的字节数。而对于数组而言,数组名加1的操作也是一样。虽然多数情况下,可以用相同的方式来使用数组名跟指针名如使用方括号表示法,或者用解除引用运算符" * "但是它们在一些情况下是有区别的,指针值允许修改,但是数组名确实常量。,还有的就是对于数组应用sizeof运算符得到的是数组的总长度,而对指针运用的话得到的是指针的长度。即使指针指向的是一个数组。还有一个有趣的地方就是对数组名进行取地址操作时,数组名不会被解释成为其本身的地址,而是解释为整个数组的地址,粗略一看好像没有什么不同,都是同一个地址,但是当我们对数组取地址后进行加减操作增加的地址值就是整个数组本身的长度(上码):

short tell[10];
cout << tell << endl;
cout << &tell << endl;
cout << &tell+2 << endl;

所以对于数组与指针之间的异同我们也应该要找个时间认真理解一下哇!!