六、C_base——指针

指针基本概念:

【1】指针

        1---指针变量:专用于存放地址的变量
        2---地址常量:内存地址

【2】定义

        int a = 10;
        int *p = &a;               
                                //  p指向a的地址
                                //  变量名:p
                                //  类型:int *       
                                //  int *p; p = &a; 

【3】运算符

        1--- *
                1、类型的一部分
                2、指针解引用(钥匙)--取值
                3、指针降级
        2--- & 
                取地址符
        3--- +-
                1、指针的加减:加减的是单位长度
                2、单位长度:指针所指向数据类型所占的字节数
        4--- []
                []:指针加单位长度后,取内容运算
                int a[5];
                int *p = a;

                a[i] <==> *(a+i)
                p[i] <==> *(p+i)

【4】指针大小

        占4个字节(32位操作系统,ubuntu)
        占8个字节(64位操作系统)

【5】atoi

        函数:int atoi(char *a)
        功能:将数值型的字符串转换成整形
        参数:数值型字符串的首地址
        注意:遇到非数值形式的字符停止转化
        例:a[] = "123a456";
               printf("%d",atoi(a));
        注意:这里打印的是%d。

函数的实现:

#include <stdio.h>
#include <strlib.h>
int main()
{
    char a[] = "1256a69b";
    char *p  = a;       //定义指针:p  类型:char *  a是数组的首地址
    int sum = 0;        //定义一个整形,承接数值型字符串的整形
    while('0'<=*p && *p<='9')  //判断是否在'0'~'9'之间,此时*p是a[0]
    {
        sum = sum*10+*p-'0';    //每次循环检测出的值给位输出
        p++;                    // a[0]、a[1]、a[2]...地址
    }
    printf("sum = %d",sum);     //注意:a地址是地址常量,p是指针变量
    return 0;
}

【6】指针数组

        指针数组:数组是本质,元素的类型是指针
        int a = 10;
        int b = 30;
        int* p[2];    //声明指针数组,有指针p[0]、p[1]、p[2]个元素
        p[0] = &a;    //p[0]是指针,类型是int *。指针是地址,所以需要&a
        p[1] = &b;

【7】二维数组

        int a[3][4] = {0};
         //[]是运算符,a[2] <==> *(a+2)     a代表整个数组的首地址
        a[1][2] <==> *(a[1]+2) <==> *(*(a+1)+2)    
        a是行指针,a+1跳一行,到下一行的首地址;
        a[0]是列指针,a[0]+1跳一列,到下一列的首地址;

【8】数组指针

        int (*p)[4];
        本质:指针,专用于指向数组
        [4]   :指向的数组是4列,必须有并且一致与数组的列
        数组指针:指向一个数组的指针,多数用于指向二维数组

        int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
        int (*p)[4];   //int (*p)[4] = a;
        p = a; 
//与上面注释两种赋值方式,a是整个数组的首地址,p = a是把指针p指向数组的首地址

【9】 四个常用函数 头文件 string.h,程序测试在最下面。

        1、strcpy
                函数原型:char *strcpy(char *dest,const char *src)

                功能:字符串拷贝
                参数:src为原串的起始地址,dest为目标串的起始地址
                返回值:目标串的起始地址
                说明:字符数组1必须足够大,拷贝时'\0'一起拷贝
        2、strcat
                函数原型:char *strcat(char *dest,const char *src)
                功能:把字符串src链接到字符串dest的后面
                参数:src为源串的起始地址,dest为目标串的起始地址
                说明:字符数组1必须足够大;连接后,串1的'\0'取消
        3、strcmp
                函数原型:int strcmp(const char *s1,const char *s2)
                功能:按照ASCII码顺序比较字符串s1和字符串s2的大小
                参数:s1、s2为字符串起始地址
                返回值:比较结果
                        字符串1 = 字符串2,返回值 = 0
                        字符串1 > 字符串2,返回值 > 0
                        字符串1 < 字符串2,返回值 < 0 

        4、strlen
                函数原型:size_t strlen(const char *s)
                功能:求字符串的长度(不含字符串结束标志'\0')
                参数:s为字符串
                返回值:字符串的长度(不含字符串结束标志'\0')       

实例:源码及注释

1、1_p.c 指针的声明

#include <stdio.h>
int main()
{
    int a = 10;
    float b = 12.34;
    char c = 'p';

    int *p = &a;    //类型:int *  变量名:p (p指向a:p存放a的地址)
    float *w = &b;  //类型:float *w   变量名:w
    char *q = &c;   //类型:char *q   变量名:q

    printf("a    = %d\n",a);   //aint型常量 10
    printf("*p   = %d\n",*p);  //指针p为a的地址,*p是a地址的值

    printf("b    = %f\n",b);
    printf( "*w   = %f\n",*w);

    printf("c     = %c\n",c);
    printf("*q    = %c\n",*q);

    return 0;
}

2、 2_P.c

#include <stdio.h>
int main(int argc, const char *argv[])
{
    short a = 10;
    float b = 12.34;
    char c = 'P';

    short *p = &a;  //类型: int*   变量名:p (p指向a:p存放a的地址)
    float *w = &b;
    char *q = &c;

    printf("p     = %p\n",p);    //指针的加减:加减的是单位长度
                     //单位长度:指针所指向的数据类型所占的字节数
    printf("p+1   = %p\n",p+1);
    printf("p+2   = %p\n",p+2);
    printf("p+3   = %p\n",p+3);

    return 0;
}

3、 3_array_P.c

#include <stdio.h>
//
//利用 * 的第二个性质  钥匙,即使对地址然后取值
int main(int argc, const char *argv[])
{
    int a[4] = {0,1,8,9};
    int i;
    for(i=0; i<4;i++)     //遍历循环打印a[0]~a[4]地址
    {
        printf("&a[%d] = %p\n",i,&a[i]);
    }

    printf("a    = %p\n",a);      //利用数组名就是数组首地址性质
    printf("a+1  = %p\n",a+1);
    printf("a+2  = %p\n",a+2);
    printf("a+3  = %p\n",a+3);

    printf("*(a+0) = %d\n",*a);  //对地址取星是打印数据,*第二性质
    printf("*(a+1) = %d\n",*(a+1));
    printf("*(a+2) = %d\n",*(a+2));
    printf("*(a+3) = %d\n",*(a+3));

    return 0;
}

4、4_arry_P.c

#include <stdio.h>
int main(int argc, const char *argv[])
{
    char a[10] = "hello";
    char *p = a;    //类型:char *    变量名:p    

    printf("a[4]    = %c\n",a[4]);  // 打印a[4]的字符
    printf("*(a+4)  = %c\n",*(a+4));

    printf("p[4]    = %c\n",p[4]);
    printf("*(p+4)  = %c\n",*(p+4));

                                    //对上面进行取地址操作
    printf("a[4]    = %p\n",&a[4]);  
    printf("*(a+4)  = %p\n",&*(a+4));   //*&互为逆运算 抵消 &*(a+4) = (a+4)
    printf("a+4     = %p\n",a+4);

    printf("p[4]    = %p\n",&p[4]);
    printf("*(p+4)  = %p\n",&*(p+4));

    return 0;
}

5、5_atoi.c

#include <stdio.h>
#include <strlib.h>
int main()
{
    char a[] = "1256a69b";
    char *p  = a;       //定义指针:p  类型:char *  a是数组的首地址
    int sum = 0;        //定义一个整形,承接数值型字符串的整形
    while('0'<=*p && *p<='9')  //判断是否在'0'~'9'之间,此时*p是a[0]
    {
        sum = sum*10+*p-'0';    //每次循环检测出的值给位输出
        p++;                    // a[0]、a[1]、a[2]...地址
    }
    printf("sum = %d",sum);     //注意:a地址是地址常量,p是指针变量
    return 0;
}

6、6_PA.c

#include <stdio.h>
//
//指针数组:本质是数组,元素的类型是指针
int main(int argc, const char *argv[])
{
    int a = 10;
    int b = 30;

    int c[5] = {0,1,2,3,4};
    int* p[3];
    p[0] = &a;
    p[1] = &b;
    p[2] = c;   //c是数组c[5]的首地址

    //*p[0]~*p[2] 是 p[0]~p[2]地址的值
    printf("*p[0]    = %d\n",*p[0]);  
    printf("*p[1]    = %d\n",*p[1]);
    printf("*p[2]    = %d\n",*p[2]);

    printf(" c[3]    = %d\n",c[3]);
    printf("*(p[2]+3) = %d\n",*(p[2]+3));
    return 0;
}

7、 7_two_array.c

#include <stdio.h>
//
//验证a+1a[0]+1区别
int main(int argc, const char *argv[])
{
    int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
    int i,j;
    for(i=0; i<3; i++)
    {
        for(j=0; j<4; j++)
        {
            printf("%p  ",&a[i][j]);
        }
        putchar(10);
    }
    //指针加单位长度后,取内容算
    printf("a[1][2]     = %d\n", a[1][2]);  
    printf("*(a[1]+2)   = %d\n", *(a[1]+2));
    printf("*(*(a+1)+2) = %d\n", *(*(a+1)+2));

/*
    printf("a    = %p\n",a);        //a:行指针,加一移动一行
    printf("a+1  = %p\n",a+1);
    printf("a+2  = %p\n",a+2);

    //a[0] a[1] a[2]:列指针,加一移动一列
    printf("a[0]   = %p\n",a[0]);   
    printf("a[0]+1 = %p\n",a[0]+1);
    printf("a[0]+2 = %p\n",a[0]+2);
    printf("a[0]+3 = %p\n",a[0]+3);
*/

//  printf("a[1] = %p\n",a[1]);
//  printf("a[2] = %p\n",a[2]);

    return 0;
}

8、 8_PA.c

#include <stdio.h>

//指针数组:本质是数组,元素是指针
//int *p[3];   [3]必须与数组列保持一致

//数组指针:本质是指针,专用于指向数组(多数用于指向二维数组)
//定义:  类型(*p)[列数];   int (*p)[3];

int main(int argc, const char *argv[])
{
    int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
    int (*p)[4];
    p = a;              //p == a

    printf("a[1][2]     = %d\n", a[1][2]);  
    printf("*(a[1]+2)   = %d\n", *(a[1]+2));
    printf("*(*(a+1)+2) = %d\n", *(*(a+1)+2));

    //p:是指针变量  a:地址常量
    printf("p[1][2]     = %d\n", p[1][2]);      
    printf("*(p[1]+2)   = %d\n", *(p[1]+2));
    printf("*(*(p+1)+2) = %d\n", *(*(p+1)+2));

//  printf("size = %d\n",sizeof(p));

    return 0;
}

9、 9_const.c

#include <stdio.h>

//const int *p = &a; 或 int * const w = &a;
int main(int argc, const char *argv[])
{
    int a = 10;
    const int *p = &a;      //*p:只读    p可以操作 例:p = &a;
//  *p = 20;
    printf("*p = %d\n",*p);


    int x = 40;
    int y = 30;
    int * const w = &x;     //w:只读    *w可以操作 例:*w = 80;
//  w = &y;
    printf("*w = %d\n",*w);

    return 0;
}

10、10_str.c

#include <stdio.h>
#include <string.h>
#define N 50             //宏定义
int main(int argc, const char *argv[])
{
    char dest[N];  
    char src[] = "welcome";

    strcpy(dest,src);   //stc的字符串复制到dest
    printf("dest:%s ,src:%s\n",dest,src);

    char dest1[N] = "welcome";
    char src1[] = "beijing";

    strcat(dest1,src1);  //strcat:src1接到dest1
    printf("dest:%s,src:%s\n",dest1,src1);

    char dest2[N] = "welcome";
    char src2[] = "beijing";

    int i;
    i = strcmp(dest2,src2);
    printf("%d\n",i);

    char dest3[N] = "welcome";
    int j;
    j = strlen(dest3);
    printf("%d\n",j);

    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Python中使用Django进行通讯录制作的步骤: 1. 创建Django项目 使用以下命令创建Django项目: ``` django-admin startproject myaddressbook ``` 2. 创建Django应用 使用以下命令创建Django应用: ``` python manage.py startapp contacts ``` 3. 配置数据库 打开myaddressbook/settings.py文件,配置数据库: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ``` 这里我们使用sqlite3数据库,如果你想使用其他数据库,需要在此处进行相应的配置。 4. 创建模型 在contacts/models.py文件中定义Contact模型: ```python from django.db import models class Contact(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) email = models.EmailField() phone = models.CharField(max_length=20) def __str__(self): return f'{self.first_name} {self.last_name}' ``` 5. 迁移数据库 运行以下命令迁移数据库: ``` python manage.py makemigrations python manage.py migrate ``` 6. 创建视图 在contacts/views.py文件中创建ContactListView视图: ```python from django.views.generic import ListView from .models import Contact class ContactListView(ListView): model = Contact ``` 7. 创建URL 在myaddressbook/urls.py文件中创建URL: ```python from django.urls import path from contacts.views import ContactListView urlpatterns = [ path('', ContactListView.as_view(), name='contact_list'), ] ``` 8. 运行服务器 使用以下命令运行Django服务器: ``` python manage.py runserver ``` 现在你可以在浏览器中访问http://127.0.0.1:8000/,就可以看到通讯录列表了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值