標籤:sscanf can print nbsp printf stdio.h img eof 程式
程式:
#include <stdio.h>#include <stdlib.h>void change(char *a){//副本 printf("change 1:%s\n", a); a="change";//實參副本指向改變,不影響實參的指向 printf("change 2:%s\n", a);}void change2(char **a){ printf("change2 1:%s\n", *a); *a="changea";//a本身不變,改變a指向記憶體的內容,a指向記憶體是指標a,改變指標a的指向,原來的指標a指向內容是不變的 printf("change2 2:%s\n", *a);}void change3(char *a){ printf("change3 1:%s\n", a); // char *b=(char *)malloc(sizeof(char)*10);//malloc分配堆記憶體(但b本身是在棧中。棧分配:char b[10],函數返回即釋放),除非free否則程式退出都不會釋放 // a=b; sscanf("changeb", "%s", a);//直接改變a指向地址的值 printf("change3 2:%s\n", a); // free(b);}void change4(int *a){//副本 printf("change4 1:%d\n", *a); int b=80; a=&b;//用實參的副本,副本指向變了,但不影響原實參的指向。除非改變原實參指向的值,即change5 printf("change4 2:%d\n", *a);}void change5(int *a){ printf("change5 1:%d\n", *a); *a=80;//a本身不變,改變a指向記憶體的內容 printf("change5 2:%d\n", *a);}void change6(int **a){ int b=70; printf("change6 1:%d\n", **a); *a=&b;//和change2一樣 printf("change6 2:%d\n", **a);}int main(){ // char *a = "main"; char *a1=a; change(a);//傳入一級指標,函數內使用是該指標的副本 printf("main 1:%s\n\n", a);//不改變,此處為main change2(&a);//傳入二級指標 printf("main 2:%s\n", a);//改變為change2中賦予的值 printf("main 2 a1:%s\n\n", a1);//change2隻是將a重新指向了新值,而原指向的值 即a1指向的值是不變的 char b[10] = "mainb";//不能此處char *b,而函數內不分配記憶體,否則sscanf報錯段吐核 // char *b="xx"; change3(b); printf("main 3:%s\n\n", b);//改變為change3中sscanf賦予的值 int c=90; change4(&c); printf("main 4:%d\n\n", c);//不改變,還是90 change5(&c); printf("main 5:%d\n\n", c);//改變為change5賦予的新值 int *d=&c;//和change2一樣 int *d1=d; change6(&d);//傳入二級指標 printf("main 6:%d\n", *d);//改變 printf("main 5:%d\n\n", *d1);//原c值 return 0;}
結果:
指標形參,二級指標改值