變量類型 *變量名;
#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"};
}