C語言複習整理(八)——指針與陣列

2020-08-08 21:32:56

指針與陣列

#include<stdio.h> 
   
int main(int argc, char *argv[])
{
int a[5] = { 1, 3, 5, 7, 9 };
printf("%d \n",a);
printf("%d \n",a+1);
printf("%d \n",a-1);
printf("%d \n",&a);
printf("%d \n",&a);
printf("%d \n",&a+1);
printf("%d \n",&a-1);
printf("%d \n",*a);
printf("%d \n",*a+1);
printf("%d \n",*a-1);
printf("%d \n",*(a+1));
printf("%d \n",*(a+4));
}
/*
1289022512 
1289022516 
1289022508 
1289022512 
1289022512 
1289022532 
1289022492 
1 
2 
0 
3 
9 
*/

a是陣列名,同時在記憶體方面,a表示陣列第一個元素的首地址,這裏需要與&a區別開來,&a表示陣列的首地址,兩者的意義不同,但是數值上一般是相同的,但是與也有不同的情況出現,這裏會涉及到大端小端的概念。
a)、a與&a的數值是一樣的,都是000000A7B855F6E8,指向了同一個記憶體地址,但是要區分開來,兩者意義不同;
b)、&a+1表示陣列a的下一個數據的地址,因爲a是一個包含5個int型元素的陣列,所以&a+1爲&a+sizeof(int)*5,64bit下,int是4位元組,所以加20,也就是加14(這裏是16進製表示);
c)、同樣,&a-1表示a的上一個數據,並且,編譯器在這裏將其大小與a一樣,所以&a-1 = &a-sizeof(int)*5;
e)、a是陣列第一個元素的首地址,所以a+1是陣列的第二個元素首地址,與a相差4byte;
f)、a-1則表示陣列的上一個「陣列的最後一個元素的首」地址,當然,這個「陣列」可能不存在或者未必是陣列,所以以本陣列a爲參考,取一個int型爲差值,所以相差4byte。

#include<stdio.h>
//&取地址printf("%d\n", &a); 輸出地址值 
//printf("%d\n",(char *)&a) ; 地址值轉換爲字元型別輸出 
//printf("%d\n", *(char *)&a) ; 輸出指針指向的字元型別的地址裏面存的變數值 
int main(int argc, char *argv[])
{
	int a = 1;
	printf("%d\n",&a);
	printf("%d\n", (char *)&a);
	printf(" %d\n",(printf("%d", (char *)&a)));
	printf("%d\n", *(char *)&a);
}
#include<stdio.h> 
#include<string.h>
//char型別爲1位元組  陣列前五個元素是十六進制數,兩位十六進制數相當於一個位元組
//(char *)a 意義是把陣列a的元素強制型別轉化爲字元 
//從低位開始擷取 第一個元素0x6f796958 從低位向高位開始擷取,先擷取58=5*16+8=88=X 
//然後是69  78  6f  直到最後的 0x30322070  的30    第六個元素爲int型別 無法強制型別轉換,轉換結束
//至此 printf("%s", (char *)a) 執行完   返回了一個數值   是printf的預設返回值,意義爲有效輸出的數據個數
//printf("  %d", printf("%s", (char *)a));  第一個%d輸出的是後面的  printf("%s", (char *)a)的返回值        
int main(int argc, char *argv[])
{
	int a[6] = {0x6f796958, 0x694c2075,,0};
	printf("  %d", printf("%s", (char *)a));
	return 0;
}
#include<stdio.h> 
#include<string.h>
//*指針指向第一個字母的地址,*str+1操作對這個字串第一個地址存的字元+1 
int main(int argc, char *argv[])
{
	char *str = "Xiyou";
	printf("%c\n", *str + 1);
	return 0;
}
#include<stdio.h>
int main()
{
	int a[3][3]={1,3,3,4,5,6,7,8,9};
	printf("%d ",**a);//*a指向a[0]地址,**a指向a[0][0]地址存的值
	printf("%d ",**(a+1));//a+1等價於a[1]地址,**(a+1)指向a[1][0]地址存的值
	printf("%d ",*(*a+1));//*a指向a[0]地址,*a+1指向a[0][1]的地址,*(*a+1)指向地址a[0][1]存的值
	printf("%d ",**a+1);//等價於a[0][0]+1
	return 0;
}
//輸出結果爲:1 4 3 2 

陣列指針、指針陣列

1、指針陣列,也就是一個數組,每個元素爲一個指針:
int p1[10];//或者應該寫成 int p1[10];

2、陣列指針,也就是一個指針,指向一個數組的指針:
int (*p2)[10];
在这里插入图片描述
指針函數和函數指針:
指針函數:本質上就是一個函數,只不過其返回值爲某個型別的指針!!!
函數指針:本質上是一個指針,指向了一個函數的實現地址,通過這個指針可以去呼叫它指向的函數!!!
所以誰修飾誰是很重要的。