Вы путаете связь переменной-указателя и связь того, на что она указывает * на 1002 *.
Связывание указателя не изменяется независимо от того, на что он указывает.
Здесь связь из ptr
равна global (она же external ), а связь c
равна static
(она же ) внутренний ). Ни один из них не меняет связи другого.
static
означает, что c
будет не будет видимым (т. Е. Доступно для прямой связи) в другом (например,) .c
файле. То есть другой .c
может не сделать:
int *ptr2 = &c;
Но, это может сделать:
int **ptr3 = &ptr;
Вы могли бы иметь обратное:
int c = 20;
static int ptr = &c;
Это static
/ внутренняя связь ptr
, указывающая на глобальную / внешнюю связь c
.
Программа имеет несколько областей памяти: .text
для кода. .data
для инициализированных переменных (таких как c
) и .bss
для унифицированных областей.
Поскольку вы инициализируете оба ptr
и c
, они оба заканчиваются в .data
Если вы сделали:
#include <stdio.h>
static int c = 20; // Static vairble
int *ptr;
int main(){
ptr = &c;
return 0;
}
Затем c
инициализируется и входит в .data
, но ptr
не инициализируется , но назначается и входит в .bss
сегмент
Все переменные [глобальные или нет] могут иметь непостоянные значения. Либо путем инициализации или назначения.
Все вышеперечисленные переменные имеют глобальный / файл scope .
Вот еще один тип области действия:
#include <stdio.h>
static int c = 20; // Static vairble
int main(){
int *ptr = &c;
return 0;
}
Здесь ptr
имеет function scope. Он помещается в кадр стека main
. Он не имеет связи, о которой можно говорить (то есть он никогда не будет отображаться в таблице символов исполняемого файла).