程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言----------指針,----------指針

C語言----------指針,----------指針

編輯:關於C語言

C語言----------指針,----------指針


地址

注: 把指針比喻成門牌號,信封郵寄地址,現在我看到指針就想起門牌號,信封地址

#include "stdio.h"

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

// output
0x7fff5fbff81c

 分析:是系統 RAM 中的特定位置,通常以十六進制的數字表示,系統通過這個地址,就可以找到相應的內容,當使用80386時,我們必須區分以下三種不同的地址:邏輯地址,線性地址,物理地址;在進行C語言指針編程中,可以讀取指針變量本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前進程數據段的地址(偏移地址),不和絕對物理地址相干,比如上面那個"0x7fff8b6a378c" 就是邏輯地址。邏輯地址不是被直接送到內存總線,而是被送到內存管理單元(MMU)。MMU由一個或一組芯片組成,其功能是把邏輯地址映射為物理地址,即進行地址轉換。下面是轉換關系圖:

 指針

 

一、指針變量的定義

 

指針:一個變量的指針就是該變量的地址(地址就是指針)

指針變量:存放變量地址的變量,他是用來指向另一個變量

1. 格式:變量類型 *指針變量名;

2. 舉例:int *p;   char *p2;

3. 注意:定義變量時的*僅僅是指針變量的象征

 

二、利用指針變量簡單修改其他變量的值

1.指向某個變量

int a;

int *p;

p = &a;

或者

int *p = &a;

 

2.修改所指向變量的值

*p = 10;

 

3.在函數內部修改外面變量的值

int a = 10;
change(&a);

void change(int *n)
{
    *n = 20;
}

 4.指針使用注意:

int main()
{

/* 不建議的寫法, int *p只能指向int類型的數據 int *p; double d = 10.0; p = &d;*/ /* 指針變量只能存儲地址 int *p; p = 200; */ /* 指針變量未經過初始化,不要拿來間接訪問其他存儲空間 int *p; printf("%d\n", *p); */ int a = 10; /* int a; a = 10; */ /* int *p; p = &a; */ // 定義變量時的*僅僅是一個象征,沒有其他特殊含義 int *p = &a; // 不正確的寫法 // *p = &a; p = &a; // 這個時候的*的作用:訪問指向變量p指向的存儲空間 *p = 20; char c = 'A'; char *cp = &c; *cp = 'D'; printf("%c\n", c);
return 0;
}
// output
D

 練習小結:

#include <stdio.h>
void swap(int *v1, int *v2);

int main()
{
    /*
    int a = 10;
    int b = 11;
    
    swap(&a, &b);
    */
    
    
    int a2 = 90;
    int b2 = 89;
    
    swap(&a2, &b2);
    
    printf("a2=%d, b2=%d\n", a2, b2);
    return 0;
}

/* 不能交換外面實參的值,僅僅是交換了內部指針的指向
void swap(int *v1, int *v2)
{
    int *temp;
    temp = v1;
    v1 = v2;
    v2 = temp;
}*/

// 完成兩個整型變量值的互換
void swap(int *v1, int *v2)
{
    int temp = *v1;
    *v1 = *v2;
    *v2 = temp;
}

/* 交換的只是內部v1、v2的值
void swap(int v1, int v2)
{
    int temp = v1;
    v1 = v2;
    v2 = temp;
}*/

 指針疑問:/*

 %d int
 %f float\double
 %ld long
 %lld long long
 %c char
 %s 字符串
 %zd  unsigned long
 */

#include <stdio.h>

/*
 0000 0001
 0000 0010
 0000 0000
 0000 0000
 
 0000 0000 0000 0000 0000 0010 0000 0001
 */

int main()
{
    // 0000 0000 0000 0000 0000 0000 0000 0010
    int i = 2;
    // 0000 0001
    char c = 1;
    
    char *p;
    p = &c;
    
    //*p = 10;
    
    printf("c的值是%d\n", *p);
    
    return 0;
}

void test()
{
    char c; // 1
    int a; // 4
    long b; // 8
    
    // 任何指針都占用8個字節的存儲空間
    char *cp;
    int *ap;
    long *bp;
    
    printf("cp=%zd, ap=%zd, bp=%zd\n",
           sizeof(cp),
           sizeof(ap),
           sizeof(bp));
}

 

三、指針與數組

1.將數組當做函數參數傳入時,會自動轉為指針

/*
 1.數組元素的訪問方式
 int ages[5];
 int *p;
 p = ages;
 1> 數組名[下標]  ages[i]
 2> 指針變量名[下標] p[i]
 3> *(p + i)
 
 2.指針變量+1,地址值究竟加多少,取決於指針的類型
  int *   4
  char *  1
  double * 8
 */
void change(int array[]);

int main()
{
    // 20個字節
    int ages[5] = {10, 11, 19, 78, 67};
    
    change(ages);
    
    return 0;
}

// 利用一個指針來接收一個數組,指針變量array指向了數組的首元素
void change(int *array)
{
    printf("%d\n", array[2]);
    //printf("%d\n", *(array+2));
}

/*
void change(int array[])
{
    int s = sizeof(array);
    
    printf("%d\n", s);
}*/

void test()
{
    double d = 10.8;
    double *dp;
    dp = &d;
    
    printf("dp = %p\n", dp);
    printf("dp + 1 = %p\n", dp + 1);
    
    int ages[5] = {10, 9, 8, 67, 56};
    
    int *p;
    // 指針變量p指向了數組的首元素
    p = &ages[0];
    // 數組名就是數組的地址,也是數組首元素的地址
    //p = ages;
    
    /*
     p ---> &ages[0]
     p + 1 ---> &ages[1]
     p + 2 ---> &ages[2]
     p + i ---> &ages[i]
     */
    
    //printf("%d\n",  *(p+2));
    
    printf("%d\n",  p[2]);
    
    /*
     for (int i = 0; i<5; i++) {
     printf("ages[%d] = %d\n", i, *(p+i));
     }*/
    
    
    //    printf("%p\n", p);
    //    printf("%p\n", p + 1);
    //    printf("%p\n", p + 2);
}

 

四. 指針與字符串

1.常量區

 存放一些常量字符串

 

 2.堆

 對象

 

 3.棧

 存放局部變量

 

掌握:

 定義字符串的2種方式

 1> 利用數組

 char name[] = "itcast";

  * 特點:字符串裡面的字符是可以修改的

  * 使用場合:字符串的內容需要經常修改

 

 2> 利用指針

  char *name = "itcast";

  * 特點:字符串其實是一個常量字符串,裡面的字符是不能修改

  * 使用場合:字符串的內容不需要修改,而且這個字符串經常使用

int main()
{
    char name[20];
    
    printf("請輸入姓名:\n");
    
    scanf("%s", name);
    
    // 'j' 'a' 'c' 'k' '\0'
    
    //printf("%c\n", name[3]);
    
    //printf("剛才輸入的字符串是:%s\n", name);
    
    return 0;
}

// 定義字符串數組
void test2()
{
    char *name = "jack";
    
    //int ages[5];
    
    // 指針數組(字符串數組)
    char *names[5] = {"jack", "rose", "jake"};
    
    // 二維字符數組(字符串數組)
    char names2[2][10] = {"jack", "rose"};
}

// 定義字符串
void test()
{
    // 字符串變量
    char name[] = "it";
    name[0] = 'T';
    
    //printf("%s\n", name);
    
    
    // "it" == 'i' + 't' + '\0'
    // 指針變量name2指向了字符串的首字符
    
    // 字符串常量
    char *name2 = "it";
    
    char *name3 = "it";
    
    //*name2 = 'T';
    
    //printf("%c\n", *name2);
    
    printf("%p\n%p\n", name2, name3);
    
    //printf("%s\n", name2);
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved