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

C語言-06復雜數據類型-03指針,-06數據類型-03指針

編輯:關於C語言

C語言-06復雜數據類型-03指針,-06數據類型-03指針


指針變量的定義

變量類型 *變量名;

#include <stdio.h>
int main()
{
    // 指針就一個作用:能夠根據一個地址值,訪問對應的存儲空間
    // 指針變量p前面的int:指針變量p只能指向int類型的數據
    int *p; // 定義了一個指針變量p
int a = 90; p = &a; // 指針變量p指向了變量a 指針變量只能存儲地址
    *p = 10;  //這裡的*與定義指針變量時的*不同,它表示訪問對應的存儲空間
    a = 20;
    
    printf("%d\n", *p);
    
    return 0;
}

指針相關

/*
 %d int
 %f float\double
 %ld long
 %lld long long
 %c char
 %s 字符串
 %zd  unsigned long
 */
#include <stdio.h>
int main()
{ 
    char *cp;
    int *ap;
    long *bp;
    
    printf("cp=%zd, ap=%zd, bp=%zd\n",
           sizeof(cp),
           sizeof(ap),
           sizeof(bp));
// 任何指針都占用8個字節的存儲空間 64位編譯器 思考下為什麼指針要分類型 (計算機根據指針的類型來確認從內存中取多少個字節的內容) }

 

 

練習

//根據指針  在函數內部修改外部的變量
#include <stdio.h>
void change(int *p);
int main()
{
    int a =10;
    change(&a);
    printf("a=%d\n",a);
    return 0;
}
void change(int *p)
{
    *p = 20;
}

 

//利用指針讓函數間接的有多個返回值 
#include <stdio.h>
int main()
{
    int a = 15;
    int b = 10;
    int he=0,cha=0;
    test(a,b,&he,&cha);
    printf("和是%d,差是%d",he,cha);
}
void test(int a,int b,int *c,int *d)
{
    *c = a+b;
    *d = a-b;
}

 指針與數組

#include <stdio.h>

/*
 1.數組元素的訪問方式
 int ages[5];
 int *p;
 p = ages;
 1> 數組名[下標]  ages[i]
 2> 指針變量名[下標] p[i]
 3> *(p + i)        //指針的+1並不是值加一
 
 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);
}

 指針與字符串

#include <stdio.h>

/*
 1.常量區
    存放一些常量字符串
 2.堆
    對象
 3.棧
   存放局部變量
 
 掌握:
 定義字符串的2種方式
 1> 利用數組
 char name[] = "itcast";  // 字符串變量
  * 特點:字符串裡面的字符是可以修改的
  * 使用場合:字符串的內容需要經常修改

    //char name[] = "it";
    //name[0] = 'T';
    //printf("%s\n", name);
    // "it" == 'i' + 't' + '\0'
 
 2> 利用指針
  char *name = "itcast";  // 字符串常量
  * 特點:字符串其實是一個常量字符串,裡面的字符是不能修改
  * 使用場合:字符串的內容不需要修改,而且這個字符串經常使用,它被緩存起來,新定義指針是不在開內存空間的
 
   // char *name2 = "it";
    //char *name3 = "it";
    
    //*name2 = 'T'; //程序會崩潰 它是常量不能修改
    
    //printf("%c\n", *name2);  // 指針變量name2指向了字符串的首字符
    
    printf("%p\n%p\n", name2, name3); //不開新空間 地址相同
    
    //printf("%s\n", name2); //直到遇到\0
 */

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"};
}

 

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