C语言学习随笔-15 指针_02 指针的定义和使用

- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
- "*" 操作符操作的是指针变量指向的内存空间

1、定义指针变量存储变量地址

int a = 10;

2、使用%p获取变量在内存中的地址

int main() 
{
    int a = 0xaabbccdd;
    //a = 100;

    //获取a的内存地址
    printf("%p\n",&a);
    getchar();

    return 0;
}

3、指针类型定义语法:指针类型 -> 数据类型*

     注:定义指针类型一定要和变量的类型一致

int* p;//定义了一个int类型的指针P
p = &a;//把a的地址赋值给指针P

4、通过指针修改变量的值

*p = 100;

printf("%p\n",&a);//%p 是以十六进制输出指针
printf("%p\n",p);

printf("%d\n",a);//这里使用%d是输出a的十进制
printf("%d\n",*p);
//int*代表是一种数据类型。int*指针类型,p才是变量名
//定义了一个指针类型的变量,可以指向一个int类型变量的地址
int* p;
p = &a;//将a的地址赋值给变量p,p也是一个变量,值是一个内存地址编号。
printf("%d\n",*p);//p指向了a的地址,*p就是a的值

char* p1 = &b;
printf("%d\n",*p1);//p1指向了b的地址,*p1就是b的值

4、指针大小

     ◆  使用sizeof()测量指针的大小,得到的总是:4或8。

     ◆  sizeof()测的是指针变量指向存储地址的大小。

     ◆  在32位操作系统下,所有指针(地址)都是32位(4个字节)。

     ◆  在64位操作系统下,所有指针(地址)都是64位(8个字节)。

int main(void)
{
    char ch = 'a';
    char* p = &ch;

    //在win32位操作系统下指针类型是4个字节大小,在win64位操作系统下指针类型是8个字节大小
    printf("%d\n",sizeof(char*));
    printf("%d\n", sizeof(int*));
    printf("%d\n", sizeof(short*));
    printf("%d\n", sizeof(long*));
    printf("%d\n", sizeof(long long*));
    printf("%d\n", sizeof(float*));
    printf("%d\n", sizeof(double*));
return 0; }

 5、野指针

      -  指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位为4字节,64位为8字节)。

      -  但是任意数值赋值给指针变量没有意义,因为这样就成了野指针,此指针指向的区域是未知的(操作系统不允许操作此指针指向的内存区域)。

      -  所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出现问题。

 int main0201(void) 
 {
     /*
       不建议将一个变量的值直接赋值给指针
       野指针:指针变量指向一个未知空间
     */
     int a= 100;
     int* p;
     p = a;//把a的值赋值给指针变量p,p为野指针,不会有问题,但没有意义

     p = 0x12345678;//给指针变量p赋值,p为野指针,不会有问题,但没有意义

     //*p = 1000;//操作野指针执行未知内存,内存出问题,报错

     //操作系统将0-255作为系统占用不允许访问操作
     //操作野指针对应的内存空间可能会报错
     printf("%d\n",p);//程序报错

     return 0;
 }

6、空指针

     野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量,C语言中,可以把NULL值赋值给次指针,这样就标志此指针为空指针,没有任何指针。

int *p = NULL;
int main() 
{
    //空指针是指内存地址编号为0的空间
    int* p = NULL;
    
    //操作空指针对应的空间一定报错
    //*p = 100;

    printf("%d\n", *p);//报错

    //空指针可以用在条件判断
    if (p == NULL)
    {
      
    }

    return 0;
}

7、万能指针

      void * 指针可以指向任意变量的内存空间

 int main() 
 {
     int a = 10;
     //int* p = &a;

     //万能指针可以接受任意类型变量的内存地址
     void* p = &a;

     //在通过万能指针修改变量的值时,需要找到变量对应的指针类型
     *(int*)p = 100;

     printf("%d\n",a);
     printf("%d\n",*(int*)p);
     //printf("%p\n",p);

     return 0;
 }

8、const修饰指针

      -  const修饰指针类型:可以修改指针变量的值,不可以修改指针指向内存空间的值

 int mainvoid) 
 {
     int a = 10;
     int b = 20;
     const int* p = &a;

     p = &b;//ok
     //*p = 100;err

     printf("%d\n",*p);

     return 0;
 }

       -  const修饰指针变量:可以修改指针指向内存空间的值,不可以修改指针变量的值 

 int main(void)
 {
     int a = 10;
     int b = 20;
     int* const p = &a;

     //p = &b;err
     *p = 200;//ok

     printf("%d\n",a);

     return 0;
 }

       -  const既修饰指针类型又修饰指针变量:只读指针

 int main(void)
 {
     int a = 10;
     int b = 20;

     //const修饰指针类型 const修饰指针变量 只读指针
     const int* const p = &a;
     printf("%d\n",*p);//10

     //**pp是一级指针变量的值  可以修改
     int** pp = &p;

     //*pp是一级指针的值
     *pp = &b;//通过二级指针可以修改一级指针的值
     **pp = 100;//通过二级指针可以修改一级指针指向的内存空间的值

     printf("%d\n",*p);//20
     //p = &a;err
     //*p = 100;err

     return 0;
 }

 

posted @ 2024-01-23 17:14  啊波波老表  阅读(59)  评论(0)    收藏  举报