黑马程序员——黑苹果的视频笔记(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"};






















































发布了16 篇原创文章 · 获赞 0 · 访问量 3083

猜你喜欢

转载自blog.csdn.net/meacholxpf/article/details/47771215
今日推荐