變量名,和指針是放在棧中的(棧中放的是臨時變量)。但是這個指針里面的內容(比如說是一個字符串)是存放在堆中的,棧中存放的是臨時變量。
char *a = getStringAddress(); //會把地址 賦給a指針變量。、
棧區也叫臨時區

雖然把 內存單元里面的內容給擦除了,但是指向這個內存單元的變量是非空的。

指針變量和 它所指向的內存空間變量是兩個不同的概念。釋放了指針變量所指向的內存空間,但是沒有它本身是沒有置成null的。
如果地址是 0x000000 以0打頭的地址是 不能賦予值的因為那是系統空間,0x000077 也是系統空間。
c也可以在棧上分配內存

注意下面這題,如果要去修改p1的值

間接賦值很重要

間接賦值可以構成很靈活的方法


臨時區分配的內存是不能被 被被調用函數使用的,因為被調用函數運行結束后,臨時區的內存空間會被施放。
二級指針一般是在main中聲明一個指針變量,然后在調用方法中分配內存空間。
在c語言中沒有字符串這種類型,通過字符數組來模擬

void main(){
//指定長度
char buf1[99] = {"1","2","3"} //編譯通過,后面剩余的96個自動填充為0
char buf1[2] = {"1","2","3"} //編譯不通過
printf("buf1:%s",buf1); //把數組的首字節傳進去會自動把這個字符串打印出來,即 "123"
printf("buf[88]:%d\n",buf1[99]); // 0 ,即%s 并不會把0打印出來,但是你非要用%d顯示是可以的
//不指定長度
char buf2[] = {"1","2","3"}
}
void main2(){
char buf3[] = "abcd" //buf3 作為字符數組應該是5個字節,,作為字符串應該是4個字節
int len = strlen(buf3);
printf("%d",len); //4 ,, strlen() 是函數
int size = sizeof(buf3); //sizeof() 內存塊的大小
printf("數組所占內存空間的大小:%d",size); //5 ,, sizeof()是標識符
return 0;
}
void main3(){
char buf3[] = "abcd" //buf3 作為字符數組應該是5個字節,,作為字符串應該是4個字節
char * p = null;
p = buf3;
for(int i=0;i
【】 和 *p 的聯系。
buf[i] ===> buf(0+i) ===> *(buf+i)
buf = buf+1; // 和下面同理
//buf 是一個指針,是只讀的常量
buf = 0x11 //其實這個buf 一被定義的時候,他就是不可變的,你只能通過buf+i 來映射出他的位置,然后通過*來取值
之所以buf不可以改變的原因是,如果改變了那就施放不了內存了,施放內存是根據他來的施放的。(在析構內存的時候,保證buf所指向的內存空間安全施放)
普通p指針和內存首地址的區別
字符串一級指針內存模型
1 buf和指針的區別

注意strcpy()這個函數,“3333” 會先在堆中定義然后拷貝到p2 malloc到的空間里面去。(這部挺關鍵)

注意最后的b[i] 要加上'\0'

char *mytp = NULL;
*to++ = *from++;// 這里會報錯的因為null分配的地址空間是0x00000 這是系統的內存地址,不是給程序用的。

char *tmpfrom = from <==> char *tmpfrom; tmpfrom = from;
相當于給指針賦值,因為char * 相當于定義一個指針變量,char* tmpfrom = from

這里的from是打印不出來的,因為from++ 了改變了指針指向了即已經不是首字節了。
注意這里的strstr(p,"abcd")模型和while的使用。(p=p+strlen("abcd))是關鍵

結果值,也以指針的形式傳進去。

間接賦值是指針存在的最大意義
|