今天上午,我學完了指針與字符串部分,這部分是通過一些例子加深對指針與字符串的理解。
我們首先來看1個例子:
#include <stdio.h>
void main(){
int a[] = {6, 60, 600};
int *p = a;
*p++; printf("%d", *p);
}
大家一起分析下,這個程序的結果是什麼?!數組裡面有3個元素,P是指向了數組首地址,然後是*p++,會輸出什麼呢?!嘿嘿!當然輸出60,因為++先結合,++後得到第二個元素的指針,然後取內容輸出60。
如果我們想第一個元素6加1,我們就應該這樣寫:
#include <stdio.h>void main(){ int a[] = {6, 60, 600}; int *p = a; (*p)++; printf("%d", *p);}
這個例子主要是鞏固優先級的問題,以及指針和數組關系的問題。
拷貝字符串
請下面這個拷貝字符串的例子:
#include <stdio.h>
void str_cpy(char * pDest, char *pSrc){
while (*pDest++ = *pSrc++);}void main(){
char sz1[32];
char sz2[] = "Hello world";
str_cpy(sz1, sz2);
printf("%s ", sz1);
}
注意分析,*pSrc++這裡的++是後綴,它是最後加1.最後什麼時候退出while循環的呢?!當然我們知道是左值為0的時候。大家是不是覺得這個拷貝字符串的函數寫得非常的簡潔啊,就1行!嘿嘿!
系統原版拷貝字符串的優勢
如果我們查詢下系統原版的拷貝字符串它比我們多1個東西,就是它會返回1個char *,我們來看看原版的好在哪裡:
#include<stdio.h>
#include<string.h>
void str_cpy(char * pDest, char *pSrc)
{
while (*pDest++ = *pSrc++);}void main()
{
char sz0[32];
char sz1[32];
char sz2[] = "Hello world";
strcpy(sz0, strcpy(sz1, sz2));
printf("%s ", sz0);
}
拷貝其實就是像整型的賦值運算,賦值運算的值等於左值,系統的這個函數返回一個左值。這樣的話,系統的拷貝字符串可以實現鏈式表達式。
有些朋友說,有點跟不上了,我覺得原因是你沒有調試啦!,如何有點疑惑的地方你就調試分析內存!我通過2周的學習有點以下學習經驗呢,在遇到問題的時候你首先自己調試分析內存去解決問題,不要去看所謂的大師的解釋!,因為大師們大多為了炫耀技術啦!他們的目標是讓不懂的你更加不懂。自己調試分析內存是學習的最快捷徑,因為內存是什麼樣子的,那麼它就是什麼樣子的啦!重要的是相信自己和相信機器。用實踐去證明大師們的理論。脫離了調試與內存分析,盲目的聽從大師的話,會迷失自我。有句話是,要成為大師就需要去模仿大師,但是模仿的東西是大師在還沒有成為大師之前的刻苦的努力,很多東西一調試1下子就會豁然開朗!很多概念的東西,我學1次我根本是不明白的,因為沒有變為我自己的,用調試的方式去學習,你會看到數據真真實實的存在於內存的哪個地方,你會很踏實的啦!