黑馬程序員——黑蘋果的視頻筆記(10)——字符串混合指針和結構體基本概念


------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------



一字符串指針
1字符串指針指向字符串

char *變量名="字符串內容"; 

"字符串內容"是常量

char *str="abc";

char ch = 'b';
char *p1 = &ch;

2字符串指針定義和初始化

定義的同時進行初始化
char *p="C Language";
等效於:
char *p;
p="C Language";

2.1、使用字符數組來保存的字符串是保存棧裏的,保存棧裏面東西是可讀可寫,

2.2、使用字符串指針來保存字符串,它保存的是字符串常量地址,常量區是隻讀的,


3字符串指針使用注意


1)可以查看字符串的每一個字符
char *str="hello";
for (int i=0;i<strlen(str);i++){
    printf("%c",*(str+1));
}
2)不可以修改字符串內容

3)妙用字符串指針
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
char *PF;
PF="%d,%d,%d,%d,%d\n";
printf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%d,%d\n",a[1]+1,*(a+1)+1);
("%s",&str);,%d\n",*(a[1]+1),*(*(a+1)+1));

4)不能夠直接接收鍵盤輸入

char *str;
scanf("%s",&str);//是錯的,不能這樣用

錯誤的原因是:str是一個野指針,他並沒有指向某一塊內 存空間

char *str = (char *)malloc(100);

scanf("%s",str);

這裏沒有使用取地址符&

printf("%s",str);

還可以這樣

char ch[100];
char *str=ch ;

scanf("%s",str);//這裏沒有使用取地址符&
printf("%s",str);

5二維字符數組概念

char st[3][6]={"china","japan","korea"};
或者:
char st[ ][6]={"china" ,"japan","korea"};
可以缺省行下標,但不能缺省列下標

char型指針數組和字符數組區別

1) 字符串指針變量本身是一個變量,用於存放字符串的首地址。而字符串本身是存放在以該首地 址爲首的一塊連續的內存空間中並以‘\0’作爲串的結束。字符數組是由於若干個數組元素組成 的,它可用來存放整個字符串。

2書寫格式區別
當一個指針變量在未取得確定地址前使用是危險的,容易引起錯誤。但是對指針變量直接賦值是
可以的。因爲C系統對指針變量

二 指針函數

1、指針函數概念
前面我們介紹過,所謂函數類型是指函數返回值的類型。在C語言中允許一個函數的返回值是一
個指針(即地址),這種返回指針值的函數稱爲指針型函數。

一般形式
類型說明符 *函數名(形參表) {
    /*函數體*/ }

驗證形參和實參的關係

int *getad(int a ,int b){
    printf("%p\n",&a);
    printf("%p\n",&b); 
     return a>b?a:b;
}


int main (){
    int a = 4,b=5;
    
    printf("%p\n",&a);
    printf("%p\n",&b);
    int *p=getad(a,b);
    
     printf("%p\n",p);
    
    return 0;
}

調用函數的時候形參變量是新分配的空間
實參和形參只是值傳遞。
int *getad(int a ,int b){
    printf("%p\n",a);
    printf("%p\n",b);

    return a>b?a:b;
}


int main (){
    int a = 4,b=5;
    
    printf("%p\n",&a);
    printf("%p\n",&b);
    int *p=getad(&a,&b);
    
    printf("%p\n",p);
    
    return 0;
}


證明了:調用函數的時候形參變量沒有新分配空間
實參和形參只是地址傳遞。


通過指針函數,輸入一個1~7之間的整數,輸出對應的星期名。

char *getDay(int n){
    char *days[]={
        "星期一",
        "星期二",
        "星期三",
        "星期四",
        "星期五",
        "星期六",
        "星期日"
    };
    
    return (n>=1&&n<=7)?days[n-1]:"輸入不合法~";
}

用指針變量作爲函數的參數,求出10個數的最大值。

int max10(int *p,int len){ int max = *p;
    for (int i=0; i<len; i++) {
        //判斷p[i]是否大於max,如果大於,則賦值給max if (*(p+i)>max) {
        //讓max一直保存最大值
        max = *(p+i); }
}
//返回最大值
return max; }
int main(int argc, const char * argv[]) { //定義數組
    int a[]={1,2,100,4,5,6}; //把函數名作爲參數傳遞
    int m = max10(a,6);
    int m = max10(a,6);
    printf(" m = %d\n",m);
    return 0; }


三函數指針

1在C語言中,一個函數總是佔用一段連續的內存區,而函數名就是該函數所佔內存區的首地址。

函數指針:指向函數的指針
指針函數:返回值是指針的函數

我們把指向函數的指針變量稱爲“函數指針變量”。




2函數指針定義方法

類型說明符 (*指針變量名)(形參列表,也可以無形參);

int (*pf)();

表示pf是一個指向函數入口的指針變量,該函數的返回值(函數值)是整型。

int (*fun)(int *p,int len);
char * (*p1)(int n);

3函數指針使用

3.1、利用函數指針調用函數

(*指針變量名) (實參表)
int arr[5]={3,54,232,234};
int (*pmax)(arr,5);
pmax = getmax ;
int m  = (*pmax)(arr,5);
printf("m=%d\n",m);
int s = pmax(arr,5);
printf("s=%d\n",s);

打印結果爲都爲234



四構造類型及結構體


1、C語言構造類型
構造數據類型是根據已定義的一個或多個數據類型用構造的方法來定義的。
構造類型分爲:

數組類型
結構體類型
共用體(聯合)類型
2
結構體

“結構”是一種構造類型,它是由若干“成員”組成的。

每一個成員可以是一個基本數據類型


3定義結構體的方法
3.1、先定義結構,再說明結構變量。
struct 結構名{
    成員表列 };


struct stu{
    int num;
    char name[20]; //char *name; char sex;
    float score;
};


#define STU struct stu
STU{
    int num;
    char name[20];
    char sex;
    float score;
    };
STU boy1,boy2;

3.2、在定義結構類型的同時說明結構變量。

struct stu{
    int num;
    char name[20];
    char sex;
    float score;
}boy1,boy2;

3.3匿名定義 

 struct{
    int num;
    char name[20]; char sex;
    float score;
}boy1,boy2;


4結構變量中成員的訪問方法

boy1.num 即第一個人的學號

boy2.sex 即第二個人的性別


boy1.birthday.month 即第一個人出生的月份成員可以在程序中單獨使用,與普通變量完全相


5結構體變量的初始化

5.1、先定義結構體變量,然後再初始化

struct stu{ int num;
    char name[20];
    char sex;
    float score;
       };
struct stu boy1,boy2;
boy1.num = 1010;
//誤區1:給數組名賦值(數組名是一個常量,不能賦值) //boy1.name="cjk"; //這是錯誤的
//相當於char name[20], name="abc"; //如果寫成char *name, 則
name="abc"可以; strcpy(boy1.name, "bbbbb");
boy1.sex = 'f'; boy1.score = 18.0f;
//誤區2:給結構體變量整體賦值(可以整體賦值,但是需要強制類型轉換) //錯誤寫法: boy1 = {10,"abc",'m',89.5};
//正確寫法 boy1 =(struct student){10,"abc",'m',89.5};
//原因: 如果不進行強制類型轉換,系統無法知道{} 是給數組賦值還是給結構體賦值

5.2、定義的同時初始化


1)
struct stu{ int num;
    char name[20]; char sex;
    float score;
} av1={1012,"xzmly",'f',30};
//注意 "xzmly"初始化賦值給了name[20];


printf("av1.name=%s",av1.name);// 初始化值的類型和順序必須與結構體定義的時候成員的類型和順序一致
struct stu boy1={1011,"zbz",'f',23};// 使用另外一已經存在的結構體初始化新的結構體

注意:兩個相同類型的結構體變量的賦值,相當普通變量的賦
值,是整體拷貝,而不是地址賦值

.2)部分初始化

struct stu boy1={.name="weige"};






















































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章